sql >> Databasteknik >  >> RDS >> Database

Skapa en relation i SQL

I SQL skapar du en relation genom att skapa en främmande nyckel-begränsning.

Mer specifikt har du ett föräldrabord och ett underordnat bord. Den överordnade innehåller den primära nyckeln och den underordnade tabellen innehåller en främmande nyckel som refererar till den primära nyckeln för den överordnade tabellen.

När du använder SQL för att skapa en relation kan du skapa relationen när du skapar tabellen, eller så kan du skapa den senare (genom att ändra tabellen). Den här artikeln täcker båda scenarierna.

Skapa en relation när du skapar tabellen

Här är ett exempel på hur du skapar en relation i din CREATE TABLE uttalande när du skapar tabellen.

CREATE TABLE Parent (
  ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
  ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ChildName nvarchar(255) NOT NULL,
  ParentId int NOT NULL
  CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId)
);

Här skapade jag två tabeller; en som heter Parent och den andra kallas Child .

Jag skapade relationen inom tabelldefinitionen för barn. Relationen skapas med CONSTRAINT argument. Observera att detta fortfarande finns i CREATE TABLE uttalande.

Relationen behöver ett namn. I det här fallet kallade jag det FK_Child_Parent . FOREIGN KEY del följs av namnet på kolumnen (i den underordnade tabellen) som kommer att vara den främmande nyckeln.

REFERENCES del anger kolumnen som den främmande nyckeln kommer att referera till. I det här fallet refererar den till ParentId kolumnen i Parent tabell. Detta görs med REFERENCES Parent (ParentId) .

Det är allt som krävs för att skapa relationen.

Observera att exemplen på den här sidan gjordes med SQL Server. Beroende på ditt DBMS kan du behöva ändra vissa detaljer i kolumndefinitionerna.

Till exempel IDENTITY är SQL Servers version av det som ibland kallas AUTO_INCREMENT i andra DBMS (som MySQL). Om du använder SQLite, så här skapar du en kolumn med automatisk ökning i SQLite.

Lägg till en relation till en befintlig tabell

Du kan också lägga till en relation till en befintlig tabell, helt enkelt genom att använda ALTER TABLE uttalande.

Låt oss låtsas att vi inte skapade relationen när vi skapade de två tabellerna från föregående exempel. Så låt oss låtsas att vi hade gjort det här istället:

CREATE TABLE Parent (
  ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
  ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  ChildName nvarchar(255) NOT NULL,
  ParentId int NOT NULL
);

Så i det här scenariot var allt vi gjorde att skapa två tabeller. Ingen relation skapades mellan dem.

Nu, efter att ha skapat tabellerna, kommer vi plötsligt ihåg "oh dang, jag glömde att skapa en relation!".

Inga problem, vi kan nu göra detta:

ALTER TABLE Child
  ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId);

Gjort. Vi har precis lagt till relationen med samma detaljer som i föregående exempel.

Observera att SQLite inte stöder att lägga till främmande nycklar med ALTER TABLE påstående. Se hur du lägger till en främmande nyckel till en befintlig tabell i SQLite för mer om det.

Vid uppdatering/radering

Som standard skapas SQL Server-relationer med ON DELETE NO ACTION och ON UPDATE NO ACTION . Därför skapades de tidigare exemplen med den här inställningen.

Däremot kan andra DBMS använda andra standardinställningar.

Hur som helst kan du uttryckligen ange detta i din kod. Så vi kan modifiera det föregående exemplet så att det ser ut så här:

ALTER TABLE Child
  ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
    REFERENCES Parent (ParentId)
    ON DELETE NO ACTION    
    ON UPDATE NO ACTION;

Vad detta egentligen betyder är att, om någon skulle försöka ta bort eller uppdatera en post i primärnyckeln, skulle ett fel inträffa och ändringen skulle återställas. Detta är SQL Servers sätt att förhindra ändringar som kan bryta referensintegriteten hos ditt system.

I grund och botten är anledningen till att du skapar en relation i första hand för att upprätthålla referensintegritet.

Du har dock några alternativ för hur du vill att SQL Server ska hantera dessa situationer.

Specifikt kan du använda något av följande värden:

  • NO ACTION :Ett fel uppstår och raderings-/uppdateringsåtgärden på raden i den överordnade tabellen återställs.
  • CASCADE :Motsvarande rader tas bort från/uppdateras i referenstabellen om den raden tas bort från/uppdateras i den överordnade tabellen.
  • SET NULL :Alla värden som utgör den främmande nyckeln är inställda på NULL om motsvarande rad i den överordnade tabellen tas bort eller uppdateras. Detta kräver att kolumnerna för främmande nyckel är nullbara.
  • SET DEFAULT :Alla värden som utgör den främmande nyckeln är inställda på sina standardvärden om motsvarande rad i den överordnade tabellen tas bort eller uppdateras. För att denna begränsning ska kunna exekveras måste alla kolumner för främmande nyckel ha standarddefinitioner. Om en kolumn är nullbar och det inte finns något explicit standardvärde, NULL blir det implicita standardvärdet för kolumnen.

  1. Fix Msg 241 "Konvertering misslyckades vid konvertering av datum och/eller tid från teckensträng" i SQL Server

  2. Övervakning av PostgreSQL i en hybridmiljö

  3. Återvänder från en funktion med parameter OUT

  4. Uppdatera flera kolumner i SQL