Detta svar tar frågans "lägg till en främmande nyckel till table3
" för att betyda att en FK (främmande nyckel) lades till i table3
hänvisar till en av kolumnerna i den sammansatta PK (primärnyckel) i table4
. I standard SQL kan en FK referera till en riktig/mindre delmängd av en PK.
Detta andra svar
tar antagligen "lägg till en främmande nyckel till table3
" för att betyda att en FK lades till i table4
med en av kolumnerna i PK-referens table3
. En FK-kolumnuppsättning i en tabell är oberoende av eventuella PK- eller UNIKA-deklarationer i den.
I standard SQL kan en FK referera till en riktig/mindre delmängd av en PK.
Den refererade kolumnlistan måste deklareras PRIMARY KEY eller UNIQUE. (PRIMÄRKEY skapar en UNIQUE NOT NULL-begränsning.) (Restriktionen måste vara explicit, även om varje uppsättning av NOT NULL-kolumner som innehåller en uppsättning som är UNIK måste vara unik.)
Tyvärr låter MySQL dig deklarera en FK som refererar till en kolumnlista som inte är UNIK. Även om en sådan FK eller en som refererar till icke-NULL-kolumner (OK i standard SQL) inte är korrekt implementerad, och själva dokumentationen rekommenderar att du inte gör det:
(Du kan fundera över vad som är och inte är de väldefinierade operationerna, eftersom dokumentationen faktiskt inte klargör.)
1.8.2.3 Utländska nyckelskillnader
13.1.18 SKAPA TABELL Syntax
13.1.18.6 Använda UTLANDET NYCKELbegränsningar
PS Re relationell vs SQL
I relationsmodellen refererar en FK till en CK (kandidatnyckel). En supernyckel är en unik kolumnuppsättning. En CK är en supernyckel som inte innehåller någon mindre supernyckel. En CK kan kallas PK (primärnyckel). När en kolumnuppsättnings värden måste visas någon annanstans säger vi att det finns en IND (inkluderingsberoende). En FK är en IND till en CK. När en IND är till en supernyckel kan vi kalla det en "främmande supernyckel".
En SQL PK
eller UNIQUE NOT NULL
förklarar en supernyckel. Det är en CK när den inte innehåller en mindre kolumnuppsättning som deklareras som SQL PK
eller UNIQUE NOT NULL
. SQL FK
förklarar en utländsk supernyckel. Så en SQL PK kan faktiskt vara en relationell PK (därav CK) och en UNIK INTE NULL kan faktiskt vara en CK. En SQL FK till en av dessa är faktiskt ett relationellt FK.