Dit antwoord neemt de vraag "voeg een externe sleutel toe aan table3
" " om aan te geven dat er een FK (buitenlandse sleutel) is toegevoegd in table3
verwijzend naar een van de kolommen van de samengestelde PK (primaire sleutel) van table4
. In standaard SQL kan een FK verwijzen naar een juiste/kleinere subset van een PK.
Dit andere antwoord
vermoedelijk duurt "voeg een externe sleutel toe aan table3
" om aan te geven dat er een FK is toegevoegd in table4
met een van de kolommen van de PK die verwijst naar table3
. Een FK-kolom in een tabel is onafhankelijk van eventuele PK- of UNIEKE-declaraties erin.
In standaard SQL kan een FK verwijzen naar een juiste/kleinere subset van een PK.
De kolomlijst waarnaar wordt verwezen, moet worden gedeclareerd als PRIMARY KEY of UNIQUE. (PRIMARY KEY creëert een UNIEKE NOT NULL-beperking.) (De beperking moet expliciet zijn, ook al moet elke set NOT NULL-kolommen die een set bevat die UNIEK is, uniek zijn.)
Helaas laat MySQL je een FK declareren die verwijst naar een kolomlijst die niet UNIEK is. Ook al is zo'n FK of een die verwijst naar niet-NULL-kolommen (OK in standaard SQL) niet correct geïmplementeerd, en de documentatie zelf adviseert dit niet te doen:
(U kunt zich afvragen wat wel en niet goed gedefinieerde bewerkingen zijn, aangezien de documentatie niet echt verduidelijkt.)
1.8.2.3 Verschillen in buitenlandse sleutels
13.1.18 MAAK TABEL Syntaxis
13.1.18.6 BUITENLANDS gebruiken BELANGRIJKSTE beperkingen
PS Re relationeel versus SQL
In het relationele model verwijst een FK naar een CK (kandidaatsleutel). Een superkey is een unieke kolommenset. Een CK is een supersleutel die geen kleinere supersleutel bevat. Eén CK kan de PK (primaire sleutel) worden genoemd. Als de waarden van een kolommenset ergens anders moeten verschijnen, spreken we van een IND (inclusieafhankelijkheid). Een FK is een IND naar een CK. Als een IND naar een superkey gaat, zouden we dat een "buitenlandse superkey" kunnen noemen.
Een SQL PK
of UNIQUE NOT NULL
verklaart een supersleutel. Het is een CK als het geen kleinere kolommenset bevat die is gedeclareerd als SQL PK
of UNIQUE NOT NULL
. SQL FK
verklaart een buitenlandse supersleutel. Dus een SQL PK kan eigenlijk zijn een relationele PK (vandaar CK) en een UNIEKE NIET NULL kunnen in feite zijn een CK. Een SQL FK naar een van deze is een relationele FK.