Sådan tilføjes fremmednøgle i SQL
Fremmednøgle er en attribut eller et sæt attributter, der refererer til primærnøgle i samme tabel eller en anden tabel (relation).
- Oprettelse af fremmednøgle sammen med tabeloprettelse
En fremmednøgle kan oprettes selv på tidspunktet for oprettelse af tabeller.
Syntaks:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Eksempel:
Først vil vi oprette en database med navnet "employeedb ”. Så i den database vil vi oprette to tabeller "medarbejder" og "afdeling". Vi vil overveje disse tabeller og database for alle de efterfølgende eksempler.
Vi vil oprette en primær nøgle og en fremmednøgle, mens vi opretter henholdsvis "medarbejder" og "afdeling"-tabellerne.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.07 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | Emp_ID | int(11) | NO | PRI | NULL | | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+-------+ 3 rows in set (0.09 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID)); Query OK, 0 rows affected (0.20 sec) mysql> DESC department; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | Dept_ID | int(11) | NO | PRI | NULL | | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.02 sec)
Vi har oprettet to primære nøgler "Emp_ID" til en "medarbejder"-tabel, "Dept_ID" til "afdeling"-tabel og "Emp_ID" som en fremmednøgle til "afdeling"-tabel, mens vi opretter tabeller. For at kontrollere, om nøglerne er tilføjet til tabeller eller ej, har vi brugt DESC-kommando.
- Oprettelse af fremmednøgle med begrænsningsnavn
En fremmednøgle kan oprettes selv på tidspunktet for oprettelse af tabeller sammen med begrænsningsnavnet. Dette begrænsningsnavn vil være nyttigt, mens du slipper en fremmednøgle fra en tabel uden at slippe en hel tabel.
Syntaks:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Eksempel:
Vi vil oprette en primær nøgle og en fremmednøgle, mens vi opretter henholdsvis "medarbejder" og "afdeling" tabellerne. Fremmednøgle vil blive oprettet sammen med fremmednøglebegrænsningen, mens selve tabellen oprettes.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.11 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | Emp_ID | int(11) | NO | PRI | NULL | | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, CONSTRAINT emp_id_fk FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID)); Query OK, 0 rows affected (0.25 sec) mysql> DESC department; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | Dept_ID | int(11) | NO | PRI | NULL | | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.04 sec)
Vi har oprettet to primære nøgler "Emp_ID" til en "medarbejder"-tabel, "Dept_ID" til "afdeling"-tabel og "Emp_ID" som en fremmednøgle til "afdeling"-tabel, mens vi opretter tabeller. Her har vi også tilføjet en begrænsning af en fremmednøgle med navnet "emp_id_fk". For at kontrollere, om nøglerne er tilføjet til tabeller eller ej, har vi brugt DESC-kommando.
- Oprettelse af fremmednøgle ved hjælp af ALTER-kommandoen
Det er muligt at oprette en fremmednøgle selv efter tabeloprettelse. Når vi opretter en tabel, hvis vi ikke har tilføjet en fremmednøgle til den, og derefter skal vi tilføje den fremmede nøgle til en eksisterende tabel, vil vi bruge ALTER-kommandoen i det tilfælde.
Syntaks:
ALTER TABLE Parent_TableName ADD FOREIGN KEY(ColumnName) REFERENCES Child_TableName(ColumnName);
Eksempel:
Vi tilføjer en fremmednøgle til en eksisterende tabel ved hjælp af ALTER-kommandoen.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.16 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | Emp_ID | int(11) | NO | PRI | NULL | auto_increment | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL); Query OK, 0 rows affected (0.12 sec) mysql> ALTER TABLE department ADD FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID); Query OK, 0 rows affected (0.23 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC department; +-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | Dept_ID | int(11) | NO | PRI | NULL | auto_increment | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec)
Vi har oprettet to primære nøgler "Emp_ID" til en "medarbejder"-tabel og "Dept_ID" til "afdeling"-tabel, mens vi opretter tabeller. Ved at bruge ALTER-kommandoen har vi tilføjet "Emp_ID" som fremmednøgle til afdelingstabellen. For at kontrollere, om nøglerne er tilføjet til tabeller eller ej, har vi brugt DESC-kommando.