sql >> Database teknologi >  >> RDS >> Database

Sådan opretter du en tabel med en fremmednøgle i SQL

Problem:

Du vil oprette en fremmednøgle til en tabel i en database.

Eksempel:

Vi vil gerne oprette en tabel med navnet student der indeholder en fremmednøgle, der refererer til id kolonne i tabellen city .

Løsning 1 (ny tabel):

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:

For at oprette en ny tabel, der indeholder en fremmednøglekolonne, der refererer til en anden tabel, skal du bruge søgeordet FOREIGN KEY REFERENCES i slutningen af ​​definitionen af ​​denne kolonne. Følg det med navnet på den refererede tabel og navnet på den refererede kolonne i parentes.

I vores eksempel opretter vi tabellen student ved hjælp af en CREATE TABLE klausul. Vi lister kolonnernes navne og sætter deres respektive datatyper i parentes. Kolonnen city_id er fremmednøglen i denne tabel og angiver værdien af ​​ID'et gemt i kolonnen id i tabellen city . Vi skriver FOREIGN KEY REFERENCES i slutningen af ​​definitionen af ​​denne kolonne og følg den med den refererede tabel og kolonne:city(id) .

Husk, at du kan oprette mere end én fremmednøgle til en tabel.

Løsning 2 (ny tabel):

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:

En anden måde at definere en fremmednøgle under tabeloprettelse er at bruge FOREIGN KEY REFERENCES klausul i slutningen af ​​kolonnedefinitionerne. I dette tilfælde efter FOREIGN KEY klausul, udpeger vi kolonnen med fremmednøgle. Dernæst kommer REFERENCES klausul sammen med navnet på den refererede tabel og kolonne.

Du kan oprette fremmednøgler på mere end én kolonne, som vist nedenfor:

Løsning 3 (ny tabel):

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 dette eksempel er begrænsningen fk_student_score_subject_id er en fremmednøgle bestående af to kolonner:score_id og subject_id . Disse to fremmednøglekolonner refererer til to kolonner i tabellen score_subjectscore_id og subject_id .

Her er et andet eksempel:

Løsning 4 (ny tabel):

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 denne kode har vi igen CONSTRAINT klausul med navnet på denne begrænsning. Brug navne, der er lette at læse og forstå. I vores eksempel bruger vi navnet fk_student_city_id , som angiver den relevante tabel og kolonne. Dernæst skriver vi FOREIGN KEY og tilføj (i parentes) navnet på den kolonne, der bliver fremmednøglen. Så har vi REFERENCES klausul efterfulgt af navnet på den refererede tabel og kolonne (her:id ).

Løsning 5 (eksisterende tabel):

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

Diskussion:

Det er også muligt at tilføje en ny fremmednøgle til en eksisterende tabel. Her er tabellen ændret ved hjælp af en ALTER TABLE klausul. Tabellens navn (i vores eksempel, student ) er placeret efter ALTER TABLE søgeord. Dernæst ADD FOREIGN KEY klausulen efterfølges af navnet på den kolonne, der vil blive brugt som fremmednøgle. Så har vi REFERENCES clause med navnet på den refererede tabel og navnet på den primære nøglekolonne i parentes.

Bemærk, at den tabel, du ændrer, skal eksistere, før denne kommando udføres.

Løsning 6 (eksisterende tabel, fremmednøglebegrænsning):

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

Diskussion:

Brug en forespørgsel som denne, hvis du vil navngive en fremmednøglekolonne som en begrænsning for en eksisterende tabel. Her er den fremmede nøgle-begrænsning navngivet fk_student_city_id . Hvis du ikke angiver begrænsningsnavnet, genererer databasen et standard begrænsningsnavn (som vil variere fra database til).


  1. Sådan får du maks. værdi af kolonnetype heltal gemt som typetekst i SQLite-tabel

  2. Hvor er mine patches?

  3. Sådan administreres MariaDB 10.3 med ClusterControl

  4. LISTAGG i Oracle for at returnere forskellige værdier