2012-10-01 13 views
6

E 'possibile avere chiave esterna di una tabella far parte della chiave primaria composta di un altro tavolo? Per esempio, se ho due tavoli, uno contiene informazioni su tutti i progetti attivi di diversi utenti e un altro contenente informazioni su quali attrezzature che viene utilizzato dai progetti:SQL Tabella chiave esterna che fa parte di una chiave primaria composita

Tabella Progetto:

Composite Primary Keys: UserId, ProjectId (né sono unici da loro stessi)

Attrezzatura Tabella:

Composite Primary Keys: UserId, ProjectId, EquipmentId (né sono unici da loro stessi)

Ora è vero Po è possibile impostare ProjectId nella tabella delle apparecchiature in modo che sia una chiave esterna dalla tabella del progetto? Quando provo, ottengo un errore che dice che la colonna in Project tabella non corrispondono a un vincolo di chiave primaria o unico esistente?

+0

Come è stata definita la chiave primaria composta? Hai aggiunto un vincolo univoco alla colonna _each_? – Oded

+0

Ma non voglio che ogni colonna sia unica. Voglio una combinazione delle due o tre colonne per essere unica. – Tony

+0

Ho chiesto come hai definito i vincoli. Non ho detto che dovresti definirli in questo modo. – Oded

risposta

8

No.

Quando si crea una chiave esterna, la chiave che si "punto a" dell'altra tabella deve essere un vincolo UNIQUE o PRIMARY KEY. Non è possibile stabilire una chiave esterna che punta a una colonna che consente valori duplicati. Sarebbe molto difficile immaginare come i dati devono "agire" se si aggiorna uno dei valori duplicati in altra tabella (per esempio).

di fare ciò che si vuole è necessario stabilire una tabella di progetti in cui è ProjectID UNIQUE o una chiave primaria e quindi puntare chiavi esterne in sia gli altri tavoli a quel tavolo.

Tra parentesi, si usa il termine "chiavi primarie" per descrivere le colonne in ogni tabella che compongono la chiave primaria. In effetti, ogni tabella può avere una sola chiave primaria. Che chiave può essere composto da uno o più colonne, ma la chiave stessa è ancora indicato il singolare. Questa è una differenza importante quando si utilizza la chiave primaria per ottimizzare le ricerche.

-1

@Larry Lustig La chiave esterna può essere parte della chiave primaria nell'altra tabella.

fonte: Dependent relationship

Controllare relazione tra le tabelle: Zdarzenie (Event) e TypZdarzenia (tipo di evento)

football Competition - database

0

E non so se questa è una buona pratica di progettazione, ma di sicuro è possibile avere una chiave esterna composta da un tavolo che è la parte della chiave primaria composta di tabella.

supponga di avere una tabella test1 con una chiave primaria composta (A, B)

Ora si può avere una tabella dice test2 avente chiave primaria (P, Q, R) dove a (P, Q) test2 riferimento (A, B) di test2.

Ho eseguito il seguente script nel database MySql e funziona perfettamente.

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); 

Nel caso summenzionato, il database è in attesa la combinazione di (A, B) per essere unico ed è, essendo una chiave primaria nella tabella test1.


Ma se si tenta di fare qualcosa di simile in seguito, lo script fallirebbe. Il database non ti consente di creare la tabella test2.

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); 

Nel sopra del database caso citato si aspetterebbe che la colonna A per essere unico individualmente e la stessa segue per la colonna B. Non importa se combinazione di (A, B) è unico.

Problemi correlati