Come aggiungere una chiave esterna in SQL
La chiave esterna è un attributo o un insieme di attributi che fa riferimento alla chiave primaria della stessa tabella o di un'altra tabella (relazione).
- Creazione di chiavi esterne e creazione di tabelle
È possibile creare una chiave esterna anche durante la creazione delle tabelle.
Sintassi:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Esempio:
In primo luogo, creeremo un database con il nome "employeedb ”. Quindi in quel database creeremo due tabelle "dipendente" e "reparto". Prenderemo in considerazione queste tabelle e database per tutti gli esempi successivi.
Creeremo una chiave primaria e una chiave esterna durante la creazione rispettivamente delle tabelle "employee" e "department".
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)
Abbiamo creato due chiavi primarie "Emp_ID" per una tabella "dipendente", "Dept_ID" per la tabella "reparto" e "Emp_ID" come chiave esterna per la tabella "reparto" durante la creazione delle tabelle. Per verificare se le chiavi vengono aggiunte o meno alle tabelle, abbiamo utilizzato il comando DESC.
- Creazione di chiavi esterne con nome di vincolo
È possibile creare una chiave esterna anche al momento della creazione di tabelle insieme al nome del vincolo. Questo nome di vincolo sarà utile durante l'eliminazione di una chiave esterna da una tabella senza eliminare un'intera tabella.
Sintassi:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Esempio:
Creeremo una chiave primaria e una chiave esterna durante la creazione rispettivamente delle tabelle "dipendente" e "reparto". La chiave esterna verrà creata insieme al vincolo di chiave esterna durante la creazione della tabella stessa.
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)
Abbiamo creato due chiavi primarie "Emp_ID" per una tabella "dipendente", "Dept_ID" per la tabella "reparto" e "Emp_ID" come chiave esterna per la tabella "reparto" durante la creazione delle tabelle. Qui, abbiamo anche aggiunto un vincolo di chiave esterna denominato "emp_id_fk". Per verificare se le chiavi vengono aggiunte o meno alle tabelle, abbiamo utilizzato il comando DESC.
- Creazione di chiavi esterne utilizzando il comando ALTER
È possibile creare una chiave esterna anche dopo la creazione della tabella. Durante la creazione di una tabella, se non abbiamo aggiunto una chiave esterna ad essa e successivamente dobbiamo aggiungere la chiave esterna a una tabella esistente, in tal caso utilizzeremo il comando ALTER.
Sintassi:
ALTER TABLE Parent_TableName ADD FOREIGN KEY(ColumnName) REFERENCES Child_TableName(ColumnName);
Esempio:
Aggiungeremo una chiave esterna a una tabella esistente usando il comando 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)
Abbiamo creato due chiavi primarie "Emp_ID" in una tabella "employee" e "Dept_ID" in una tabella "dipartimento" durante la creazione delle tabelle. Quindi usando il comando ALTER abbiamo aggiunto "Emp_ID" come chiave esterna alla tabella del dipartimento. Per verificare se le chiavi vengono aggiunte o meno alle tabelle, abbiamo utilizzato il comando DESC.