Cómo agregar una clave externa en SQL
La clave externa es un atributo o un conjunto de atributos que hace referencia a la clave principal de la misma tabla o de otra tabla (relación).
- Creación de clave externa junto con creación de tablas
Se puede crear una clave externa incluso al momento de crear las tablas.
Sintaxis:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Ejemplo:
En primer lugar, crearemos una base de datos con el nombre “empleadob ”. Luego en esa base de datos crearemos dos tablas “empleado” y “departamento”. Consideraremos estas tablas y la base de datos para todos los ejemplos posteriores.
Crearemos una clave principal y una clave externa mientras creamos las tablas "empleado" y "departamento" respectivamente.
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)
Hemos creado dos claves principales "Emp_ID" para una tabla de "empleados", "Dept_ID" para la tabla de "departamento" y "Emp_ID" como clave externa para la tabla de "departamento" al crear las tablas. Para verificar si las claves se agregan a las tablas o no, hemos utilizado el comando DESC.
- Creación de clave externa con nombre de restricción
Se puede crear una clave externa incluso al momento de crear tablas junto con el nombre de la restricción. Este nombre de restricción será útil al eliminar una clave externa de una tabla sin eliminar una tabla completa.
Sintaxis:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Ejemplo:
Crearemos una clave principal y una clave externa mientras creamos las tablas de "empleado" y "departamento" respectivamente. La clave externa se creará junto con la restricción de clave externa al crear la tabla en sí.
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)
Hemos creado dos claves principales "Emp_ID" para una tabla de "empleados", "Dept_ID" para la tabla de "departamento" y "Emp_ID" como clave externa para la tabla de "departamento" al crear las tablas. Aquí, también hemos agregado una restricción de clave externa denominada "emp_id_fk". Para verificar si las claves se agregan a las tablas o no, hemos utilizado el comando DESC.
- Creación de clave externa usando el comando ALTER
Es posible crear una clave externa incluso después de la creación de la tabla. Al crear una tabla, si no le hemos agregado una clave externa y luego necesitamos agregar la clave externa a una tabla existente, usaremos el comando ALTER en ese caso.
Sintaxis:
ALTER TABLE Parent_TableName ADD FOREIGN KEY(ColumnName) REFERENCES Child_TableName(ColumnName);
Ejemplo:
Agregaremos una clave externa a una tabla existente usando el 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)
Hemos creado dos claves principales "Emp_ID" para una tabla de "empleados" y "Dept_ID" para la tabla de "departamento" al crear tablas. Luego, usando el comando ALTER, hemos agregado "Emp_ID" como clave externa a la tabla de departamentos. Para verificar si las claves se agregan a las tablas o no, hemos utilizado el comando DESC.