2012-10-01 9 views
6

Ist es möglich, dass der Fremdschlüssel einer Tabelle Teil des zusammengesetzten Primärschlüssels einer anderen Tabelle ist? Zum Beispiel, wenn ich zwei Tabellen, enthält eine Information zu allen aktiven Projekten verschiedenen Benutzer und andere enthalten Informationen darüber, welche Ausrüstung wird von den Projekten eingesetzt:SQL-Tabelle Fremdschlüssel, der Teil eines zusammengesetzten Primärschlüssels ist

Projekt Tabelle:

Composite Primary Keys: UserId, ProjectId (beide nicht eindeutig sind von ihnen selbst)

Ausstattungstabelle:

Composite Primary Keys: UserId, ProjectId, EquipmentId (weder sind für sich einzigartig)

Jetzt ist es po Kann die ProjectId in der Equipment-Tabelle als Fremdschlüssel aus der Projekttabelle gesetzt werden? Wenn ich es versuche, erhalte ich eine Fehlermeldung, dass die Spalte in der Projekttabelle keinem vorhandenen Primärschlüssel oder einer eindeutigen Einschränkung entspricht?

+0

Wie haben Sie den zusammengesetzten Primärschlüssel definiert? Haben Sie eine eindeutige Einschränkung für die Spalte _each_ hinzugefügt? – Oded

+0

Aber ich möchte nicht, dass jede Spalte einzigartig ist. Ich möchte eine Kombination der zwei oder drei Spalten, um einzigartig zu sein. – Tony

+0

Ich fragte, wie Sie die Einschränkungen definiert haben. Ich habe nicht gesagt, dass du sie so definieren solltest. – Oded

Antwort

8

Nr

Wenn Sie einen Fremdschlüssel erstellen, ist der Schlüssel, dass Sie „Punkt“ in der anderen Tabelle muss eine eindeutige oder PRIMARY KEY-Einschränkung sein. Sie können keinen Fremdschlüssel festlegen, der auf eine Spalte verweist, die doppelte Werte zulässt. Es wäre sehr schwer vorstellbar, wie die Daten "funktionieren" sollten, wenn Sie einen der doppelten Werte in der anderen Tabelle (zum Beispiel) aktualisieren.

Um zu tun, was Sie wollen, müssen Sie eine Projekte Tabelle, in der ProjectID ist UNIQUE oder ein PRIMARY KEY und dann zeigen Fremdschlüssel in beide die anderen Tabellen zu dieser Tabelle.

Anscheinend verwenden Sie den Begriff "Primärschlüssel", um die Spalten in jeder Tabelle zu beschreiben, aus denen der Primärschlüssel besteht. In der Tat kann jede Tabelle einen einzigen Primärschlüssel haben. Dieser Schlüssel kann aus einer oder mehreren Spalten bestehen, aber der Schlüssel selbst wird immer noch auf die Einzahl bezogen. Dies ist ein wichtiger Unterschied, wenn Sie den Primärschlüssel zum Optimieren der Suche verwenden.

-1

@Larry Lustig Der Fremdschlüssel kann Teil des Primärschlüssels in der anderen Tabelle sein.

Quelle: Dependent relationship

prüfen Beziehung zwischen Tabellen: Zdarzenie (Ereignis) und TypZdarzenia (Ereignistyp)

football Competition - database

0

Es weiß nicht, ob das ein gutes Design der Praxis ist aber für sicher, dass es Es ist möglich, einen zusammengesetzten Fremdschlüssel einer Tabelle zu haben, der Teil des zusammengesetzten Primärschlüssels einer anderen Tabelle ist.

Sagen wir eine Tabelle Test1 haben einen zusammengesetzten Primärschlüssel (A, B)

Jetzt können wir eine Tabelle mit sagen test2 haben mit Primärschlüssel (P, Q, R), wobei in (P, Q) von Test2-Referenzierung (A, B) von test2.

Ich lief das folgende Skript in der MySql-Datenbank und es funktioniert gut.

CREATE TABLE `test1` (
`A` INT NOT NULL, 
`B` VARCHAR(2) NOT NULL, 
`C` DATETIME NULL, 
`D` VARCHAR(45) NULL, 
PRIMARY KEY (`A`, `B`)); 


CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NOT NULL, 
`R` INT NOT NULL, 
`S` DATETIME NULL, 
`T` VARCHAR(8) NULL, 
PRIMARY KEY (`P`, `Q`, `R`), 
INDEX `PQ_idx` (`P`,`Q` ASC), 
CONSTRAINT `PQ` 
    FOREIGN KEY (`P`, `Q`) 
    REFERENCES `test1` (`A`,`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

In dem oben genannten Fall wird die Datenbank, die die Kombination von erwartet (A, B) eindeutig zu sein, und es ist ein Primärschlüssel in Tabelle Test1 ist.


Aber wenn Sie versuchen, so etwas wie folgendes zu tun, würde das Skript fehlschlagen. In der Datenbank können Sie die test2-Tabelle nicht erstellen.

CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NULL, 
`R` DATETIME NULL, 
`S` VARCHAR(8) NULL, 
`T` VARCHAR(45) NULL, 
    INDEX `P_idx` (`P` ASC), 
    INDEX `Q_idx` (`Q` ASC), 
    CONSTRAINT `P` 
    FOREIGN KEY (`P`) 
    REFERENCES `test1` (`A`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `Q` 
    FOREIGN KEY (`Q`) 
    REFERENCES `test1` (`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

In der oben genannten Fall würde Datenbank der Spalte A erwarten individuell, einzigartig zu sein und das gleiche folgt für Spalte B Dabei spielt es keine Rolle, ob Kombination von (A, B) eindeutig ist.

Verwandte Themen