Hur man lägger till främmande nyckel i SQL
Främmande nyckel är ett attribut eller en uppsättning attribut som refererar till primärnyckeln i samma tabell eller en annan tabell (relation).
- Skapa främmande nyckel tillsammans med tabellskapande
En främmande nyckel kan skapas även vid tidpunkten för att skapa tabeller.
Syntax:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Exempel:
Först kommer vi att skapa en databas med namnet "employeedb ”. Sedan kommer vi i den databasen att skapa två tabeller "anställd" och "avdelning". Vi kommer att överväga dessa tabeller och databaser för alla efterföljande exempel.
Vi kommer att skapa en primärnyckel och en främmande nyckel samtidigt som vi skapar tabellerna "anställd" respektive "avdelning".
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 skapat två primärnycklar "Emp_ID" till en "anställd"-tabell, "Dept_ID" till "department"-tabellen och "Emp_ID" som en främmande nyckel till "department"-tabellen när vi skapade tabeller. För att verifiera om nycklarna läggs till i tabeller eller inte, har vi använt kommandot DESC.
- Skapa främmande nyckel med begränsningsnamn
En främmande nyckel kan skapas även vid tidpunkten för att skapa tabeller tillsammans med begränsningsnamnet. Detta begränsningsnamn kommer att vara användbart när du släpper en främmande nyckel från en tabell utan att släppa en hel tabell.
Syntax:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Exempel:
Vi kommer att skapa en primärnyckel och en främmande nyckel samtidigt som vi skapar tabellerna "anställd" respektive "avdelning". Främmande nyckel kommer att skapas tillsammans med den främmande nyckeln när du skapar själva tabellen.
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 skapat två primärnycklar "Emp_ID" till en "anställd"-tabell, "Dept_ID" till "department"-tabellen och "Emp_ID" som en främmande nyckel till "department"-tabellen när vi skapade tabeller. Här har vi också lagt till främmande nyckel-begränsning som heter "emp_id_fk". För att verifiera om nycklarna läggs till i tabeller eller inte, har vi använt kommandot DESC.
- Skapa främmande nycklar med kommandot ALTER
Det är möjligt att skapa en främmande nyckel även efter att tabellen skapats. När vi skapar en tabell om vi inte har lagt till en främmande nyckel till den och efter det måste vi lägga till den främmande nyckeln till en befintlig tabell kommer vi att använda kommandot ALTER i så fall.
Syntax:
ALTER TABLE Parent_TableName ADD FOREIGN KEY(ColumnName) REFERENCES Child_TableName(ColumnName);
Exempel:
Vi kommer att lägga till en främmande nyckel till en befintlig tabell med kommandot ALTER.
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 skapat två primärnycklar "Emp_ID" till en "anställd"-tabell och "Dept_ID" till "avdelning"-tabellen när vi skapade tabeller. Genom att använda kommandot ALTER har vi lagt till "Emp_ID" som främmande nyckel till avdelningstabellen. För att verifiera om nycklarna läggs till i tabeller eller inte, har vi använt kommandot DESC.