Mysql
 sql >> Database >  >> RDS >> Mysql

Solo una chiave dalla chiave primaria composita come chiave esterna

Questa risposta prende la domanda "aggiungi una chiave esterna a table3 " significa che è stata aggiunta una FK (chiave esterna) in table3 facendo riferimento a una delle colonne della PK composita (chiave primaria) di table4 . In SQL standard un FK può fare riferimento a un sottoinsieme proprio/più piccolo di un PK.

Questa altra risposta presumibilmente richiede "aggiungi una chiave esterna a table3 " significa che è stato aggiunto un FK in table4 con una delle colonne della PK che fa riferimento a table3 . Una colonna FK impostata in una tabella è indipendente da qualsiasi dichiarazione PK o UNIQUE in essa contenuta.

In SQL standard un FK può fare riferimento a un sottoinsieme proprio/più piccolo di un PK.

L'elenco delle colonne di riferimento deve essere dichiarato CHIAVE PRIMARIA o UNICO. (PRIMARY KEY crea un vincolo UNIQUE NOT NULL.) (Il vincolo deve essere esplicito, anche se qualsiasi insieme di colonne NOT NULL contenente un insieme UNIQUE deve essere univoco.)

Sfortunatamente MySQL ti consente di dichiarare un FK facendo riferimento a un elenco di colonne che non è UNICO. Anche se un tale FK o uno che fa riferimento a colonne non NULL (OK nell'SQL standard) non è implementato correttamente e la documentazione stessa consiglia di non farlo:

(Puoi riflettere su quali sono e non sono le operazioni ben definite, dal momento che la documentazione in realtà non chiarisce.)

1.8.2.3 Differenze chiave esterna
13.1.18 CREA TABELLA Sintassi
13.1.18.6 Utilizzo di FOREIGN Vincoli CHIAVE

PS Re relazionale vs SQL

Nel modello relazionale un FK fa riferimento a un CK (candidate key). Una superchiave è un insieme di colonne univoco. Un CK è una superkey che non contiene una superkey più piccola. Un CK può essere chiamato PK (chiave primaria). Quando i valori di un set di colonne devono apparire altrove, diciamo che esiste un IND (dipendenza di inclusione). Un FK è un IND per un CK. Quando un IND è su una superchiave, potremmo chiamarla una "superchiave straniera".

Un PK SQL o UNIQUE NOT NULL dichiara una superchiave. È un CK quando non contiene un set di colonne più piccolo dichiarato come SQL PK o UNIQUE NOT NULL . SQL FK dichiara una superchiave esterna. Quindi una PK SQL potrebbe effettivamente essere un PK relazionale (da cui CK) e un UNIQUE NOT NULL potrebbero effettivamente essere un CK. Un SQL FK per uno di questi in realtà è un FK relazionale.