Jak dodać klucz obcy w SQL
Klucz obcy to atrybut lub zestaw atrybutów, który odwołuje się do klucza podstawowego tej samej tabeli lub innej tabeli (relacja).
- Tworzenie klucza obcego wraz z tworzeniem tabeli
Klucz obcy można utworzyć nawet w momencie tworzenia tabel.
Składnia:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Przykład:
Najpierw utworzymy bazę danych o nazwie „pracownik ”. Następnie w tej bazie stworzymy dwie tabele „pracownik” i „dział”. Rozważymy te tabele i bazę danych we wszystkich kolejnych przykładach.
Stworzymy klucz podstawowy i klucz obcy podczas tworzenia odpowiednio tabel „pracownik” i „dział”.
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)
Podczas tworzenia tabel stworzyliśmy dwa klucze podstawowe „Emp_ID” do tabeli „pracownik”, „Dept_ID” do tabeli „departament” oraz „Emp_ID” jako klucz obcy do tabeli „departament”. Aby sprawdzić, czy klucze zostały dodane do tabel, czy nie, użyliśmy polecenia DESC.
- Tworzenie klucza obcego z nazwą ograniczenia
Klucz obcy można utworzyć nawet w momencie tworzenia tabel wraz z nazwą ograniczenia. Ta nazwa ograniczenia będzie przydatna podczas usuwania klucza obcego z tabeli bez usuwania całej tabeli.
Składnia:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Przykład:
Stworzymy klucz podstawowy i klucz obcy tworząc odpowiednio tabele „pracownik” i „dział”. Klucz obcy zostanie utworzony wraz z ograniczeniem klucza obcego podczas tworzenia samej tabeli.
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)
Podczas tworzenia tabel stworzyliśmy dwa klucze podstawowe „Emp_ID” do tabeli „pracownik”, „Dept_ID” do tabeli „departament” oraz „Emp_ID” jako klucz obcy do tabeli „departament”. Tutaj dodaliśmy również ograniczenie klucza obcego o nazwie „emp_id_fk”. Aby sprawdzić, czy klucze zostały dodane do tabel, czy nie, użyliśmy polecenia DESC.
- Tworzenie klucza obcego za pomocą polecenia ALTER
Możliwe jest utworzenie klucza obcego nawet po utworzeniu tabeli. Podczas tworzenia tabeli, jeśli nie dodaliśmy do niej klucza obcego, a następnie musimy dodać klucz obcy do istniejącej tabeli, wówczas użyjemy polecenia ALTER.
Składnia:
ALTER TABLE Parent_TableName ADD FOREIGN KEY(ColumnName) REFERENCES Child_TableName(ColumnName);
Przykład:
Dodamy klucz obcy do istniejącej tabeli za pomocą polecenia 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)
Podczas tworzenia tabel utworzyliśmy dwa klucze podstawowe „Emp_ID” do tabeli „pracownik” oraz „Dept_ID” do tabeli „departament”. Następnie za pomocą polecenia ALTER dodaliśmy „Emp_ID” jako klucz obcy do tabeli działów. Aby sprawdzić, czy klucze zostały dodane do tabel, czy nie, użyliśmy polecenia DESC.