sql >> Databasteknik >  >> RDS >> Mysql

Endast en nyckel från sammansatt primärnyckel som främmande nyckel

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.



  1. Dynamisk SQL-exekvering i SQL Server

  2. Är timestampdiff() i MySQL ekvivalent med datediff() i SQL Server?

  3. Benchmarking Postgres-XL

  4. hur man skapar en tabell i oracle