sql >> Databasteknik >  >> RDS >> Database

Hur man skapar en tabell med en främmande nyckel i SQL

Problem:

Du vill skapa en främmande nyckel för en tabell i en databas.

Exempel:

Vi skulle vilja skapa en tabell med namnet student som innehåller en främmande nyckel som refererar till id kolumnen i tabellen city .

Lösning 1 (ny tabell):

CREATE TABLE student (
id INT PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
city_id INT FOREIGN KEY REFERENCES city(id)
);

Diskussion:

För att skapa en ny tabell som innehåller en främmande nyckelkolumn som refererar till en annan tabell, använd nyckelordet FOREIGN KEY REFERENCES i slutet av definitionen av den kolumnen. Följ det med namnet på den refererade tabellen och namnet på den refererade kolumnen inom parentes.

I vårt exempel skapar vi tabellen student med en CREATE TABLE klausul. Vi listar kolumnernas namn och sätter deras respektive datatyper inom parentes. Kolumnen city_id är den främmande nyckeln i denna tabell och indikerar värdet på ID:t som är lagrat i kolumnen id i tabellen city . Vi skriver FOREIGN KEY REFERENCES i slutet av definitionen av denna kolumn och följ den med den refererade tabellen och kolumnen:city(id) .

Tänk på att du kan skapa mer än en främmande nyckel för en tabell.

Lösning 2 (ny tabell):

CREATE TABLE student (
id INT PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
city_id INT,
FOREIGN KEY (city_id) REFERENCES city(id)
);

Diskussion:

Ett annat sätt att definiera en främmande nyckel under tabellskapandet är att använda FOREIGN KEY REFERENCES klausul i slutet av kolumndefinitionerna. I det här fallet efter FOREIGN KEY sats, utser vi kolumnen för främmande nyckel. Därefter kommer REFERENCES klausul tillsammans med namnet på den refererade tabellen och kolumnen.

Du kan skapa främmande nycklar på mer än en kolumn, som visas nedan:

Lösning 3 (ny tabell):

CREATE TABLE student (
id INT PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
score_id INT,
subject_id INT,
      CONSTRAINT fk_student_score_subject_id 
      FOREIGN KEY (subject_id, score_id) REFERENCES score_subject(subject_id, score_id)
);

I det här exemplet är begränsningen fk_student_score_subject_id är en främmande nyckel som består av två kolumner:score_id och subject_id . Dessa två kolumner för främmande nyckel refererar till två kolumner i tabellen score_subjectscore_id och subject_id .

Här är ett annat exempel:

Lösning 4 (ny tabell):

CREATE TABLE student (
id INT PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
city_id INT,
      CONSTRAINT fk_student_city_id 
      FOREIGN KEY (city_id) REFERENCES city(id)
);

Diskussion:

I den här koden har vi återigen CONSTRAINT klausul med namnet på denna begränsning. Använd namn som är lätta att läsa och förstå. I vårt exempel använder vi namnet fk_student_city_id , som anger relevant tabell och kolumn. Därefter skriver vi FOREIGN KEY och lägg till (inom parentes) namnet på kolumnen som blir den främmande nyckeln. Sedan har vi REFERENCES sats följt av namnet på den refererade tabellen och kolumnen (här:id ).

Lösning 5 (befintlig tabell):

ALTER TABLE student
ADD FOREIGN KEY (city_id) REFERENCES city(id);

Diskussion:

Det är också möjligt att lägga till en ny främmande nyckel till en befintlig tabell. Här ändras tabellen med en ALTER TABLE klausul. Tabellnamnet (i vårt exempel, student ) placeras efter ALTER TABLE nyckelord. Därefter ADD FOREIGN KEY sats följs av namnet på kolumnen som kommer att användas som främmande nyckel. Sedan har vi REFERENCES clause med namnet på den refererade tabellen och namnet på primärnyckelkolumnen inom parentes.

Observera att tabellen du ändrar måste finnas innan det här kommandot körs.

Lösning 6 (befintlig tabell, begränsning av främmande nyckel):

ALTER TABLE student
      ADD CONSTRAINT fk_student_city_id 
      FOREIGN KEY (city_id) REFERENCES city(id)

Diskussion:

Använd en fråga som denna om du vill namnge en kolumn för främmande nyckel som en begränsning för en befintlig tabell. Här heter den främmande nyckelbegränsningen fk_student_city_id . Om du inte anger begränsningsnamnet genererar databasen ett standard begränsningsnamn (som kommer att variera beroende på databas).


  1. Kan %NOTFOUND returnera null efter en hämtning?

  2. Installera Oracle Instant-klienten i Docker-behållaren för Python cx_Oracle

  3. Var lagrar PostgreSQL databasen?

  4. Bash-skript för att infoga värden i MySQL