sql >> Database >  >> RDS >> Database

Een relatie maken in SQL

In SQL maakt u een relatie door een externe sleutelbeperking te maken.

Meer specifiek heb je een bovenliggende tabel en een onderliggende tabel. De ouder bevat de primaire sleutel en de onderliggende tabel bevat een externe sleutel die verwijst naar de primaire sleutel van de bovenliggende tabel.

Wanneer u SQL gebruikt om een ​​relatie te maken, kunt u de relatie maken op het moment dat u de tabel maakt, of u kunt deze later maken (door de tabel te wijzigen). Dit artikel behandelt beide scenario's.

Maak een relatie bij het maken van de tabel

Hier is een voorbeeld van het maken van een relatie binnen uw CREATE TABLE verklaring op het moment dat u de tabel maakt.

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)
);

Hier heb ik twee tabellen gemaakt; een genaamd Parent en de andere heet Child .

Ik heb de relatie gemaakt binnen de tabeldefinitie voor kind. De relatie wordt gemaakt met de CONSTRAINT argument. Merk op dat dit nog steeds in de CREATE TABLE staat verklaring.

De relatie heeft een naam nodig. In dit geval noemde ik het FK_Child_Parent . De FOREIGN KEY part wordt gevolgd door de naam van de kolom (in de onderliggende tabel) die de externe sleutel zal zijn.

De REFERENCES part specificeert de kolom waarnaar de refererende sleutel zal verwijzen. In dit geval verwijst het naar de ParentId kolom van de Parent tafel. Dit wordt gedaan met behulp van REFERENCES Parent (ParentId) .

Dat is alles wat nodig is om de relatie te creëren.

Merk op dat de voorbeelden op deze pagina zijn gedaan met SQL Server. Afhankelijk van uw DBMS moet u mogelijk enkele details van de kolomdefinities wijzigen.

Bijvoorbeeld IDENTITY is de SQL Server-versie van wat soms AUTO_INCREMENT wordt genoemd in andere DBMS'en (zoals MySQL). Als u SQLite gebruikt, kunt u als volgt een automatisch oplopende kolom maken in SQLite.

Een relatie toevoegen aan een bestaande tabel

U kunt ook een relatie aan een bestaande tabel toevoegen, gewoon door de ALTER TABLE . te gebruiken verklaring.

Laten we doen alsof we de relatie niet hebben gemaakt bij het maken van de twee tabellen uit het vorige voorbeeld. Dus laten we doen alsof we dit in plaats daarvan hebben gedaan:

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
);

Dus in dit scenario hebben we alleen twee tabellen gemaakt. Er is geen relatie tussen hen ontstaan.

Nu, na het maken van de tabellen, herinneren we ons plotseling "oh verdorie, ik vergat een relatie te maken!".

Geen probleem, we kunnen dit nu doen:

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

Klaar. We hebben zojuist de relatie toegevoegd met dezelfde details als in het vorige voorbeeld.

Merk op dat SQLite het toevoegen van externe sleutels met de ALTER TABLE . niet ondersteunt uitspraak. Zie hoe u een externe sleutel toevoegt aan een bestaande tabel in SQLite voor meer informatie hierover.

Bij bijwerken/verwijderen

Standaard worden SQL Server-relaties aangemaakt met ON DELETE NO ACTION en ON UPDATE NO ACTION . Daarom zijn de vorige voorbeelden gemaakt met deze instelling.

Verschillende DBMS'en kunnen echter andere standaardinstellingen gebruiken.

Hoe dan ook, je kunt dit expliciet specificeren in je code. We kunnen het vorige voorbeeld dus aanpassen om er als volgt uit te zien:

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

Wat dit in feite betekent, is dat als iemand zou proberen een record in de primaire sleutel te verwijderen of bij te werken, er een fout zou optreden en de wijziging zou worden teruggedraaid. Dit is de manier waarop SQL Server wijzigingen voorkomt die de referentiële integriteit van uw systeem zouden kunnen verbreken.

Kortom, de reden waarom je een relatie creëert, is om referentiële integriteit af te dwingen.

U hebt echter enkele opties met hoe u wilt dat SQL Server met deze situaties omgaat.

U kunt met name een van de volgende waarden gebruiken:

  • NO ACTION :Er is een fout opgetreden en de actie voor verwijderen/bijwerken op de rij in de bovenliggende tabel wordt teruggedraaid.
  • CASCADE :Overeenkomstige rijen worden verwijderd uit/bijgewerkt in de referentietabel als die rij wordt verwijderd uit/bijgewerkt in de bovenliggende tabel.
  • SET NULL :Alle waarden waaruit de refererende sleutel bestaat, zijn ingesteld op NULL als de corresponderende rij in de bovenliggende tabel wordt verwijderd of bijgewerkt. Dit vereist dat de vreemde-sleutelkolommen nullable zijn.
  • SET DEFAULT :Alle waarden waaruit de refererende sleutel bestaat, worden ingesteld op hun standaardwaarden als de corresponderende rij in de bovenliggende tabel wordt verwijderd of bijgewerkt. Om deze beperking uit te voeren, moeten alle externe-sleutelkolommen standaarddefinities hebben. Als een kolom nullable is en er geen expliciete standaardwaarde is ingesteld, NULL wordt de impliciete standaardwaarde van de kolom.

  1. Een overzicht van Quests Nieuwste databasebewakingsservice - Spotlight Cloud

  2. Hoe controleer je of IDENTITY_INSERT is ingesteld op AAN of UIT in SQL Server?

  3. SQL Server-statistieken bijwerken voor grote tabellen

  4. Gebruikerswachtwoord wijzigen in PostgreSQL