Además de la definición de las columnas de una tabla, la sentencia CREATE TABLE identifica la clave primaria de la tabla y las relaciones de la tabla con otras tablas de la base de datos. Las cláusulas PRIMARY KEY (PK) y FOREIGN KEY (FK) manejan estas funciones.
La cláusula PRIMARY KEY especifica la columna o columnas que forman la clave primaria de la tabla. Al especificar una clave primaria, el gestor de la base de datos requiere automáticamente que el valor de la clave primaria sea único en cada fila de la tabla. Además, la definición de columna para todas las columnas que forman la clave primaria debe especificar que la columna es NOT NULL.
La cláusula FOREIGN KEY especifica una clave foránea en la tabla y la relación que crea con otra tabla (padre) de la base de datos. La cláusula especifica:
- La columna o columnas que forman la clave foránea, todas las cuales son columnas de la tabla que está siendo creada.
- La tabla que es referenciada por la clave foránea. Esta es la tabla padre en la relación, la tabla que está siendo definida es el hijo.
- Un nombre opcional para la relación. El nombre no se utiliza en ninguna sentencia SQL, pero puede aparecer en mensajes de error y es necesario si se desea poder suprimir la clave foránea posteriormente.
- Una regla de supresión opcional para la relación (RESTRICT, CASCADE o SET NULL). Si no se especifica la regla de supresión se utiliza por defecto la regla RESTRICT.
Las reglas de supresión especifican qué debe hacer cuando un usuario trate de suprimir una fila de la tabla padre.
- Si la regla de supresión es RESTRICT se impide suprimir una fila de la tabla padre si la fila tiene algún hijo.
- La regla de supresión CASCADE indica que si se suprime una fila padre, todas las filas hijo también sean suprimidas, con lo cual la supresión en la tabla padre se propaga a las tablas hijo.
- Por último, la regla SET NULL indica que cuando una fila padre sea suprimida, los valores de clave foránea de todas las filas hijo deben ser automáticamente puestas a NULL.
Cuando el gestor de la base de datos procesa la sentencia CREATE TABLE, compara cada definición de clave foránea con la definición de la tabla que referencia, asegurándose que la clave foránea y la clave primaria de la tabla referenciada concuerden en el número de columnas que contienen y en sus tipos de datos. La tabla referenciada debe estar ya definida en la base de datos para que esta comparación tenga éxito.
Si dos o más tablas forman un ciclo referencial (ambas se referencian mutuamente), no se puede definir la clave foránea de la tabla que se cree en primer lugar, ya que la tabla referenciada todavía no existe. En su lugar debe crearse la tabla sin definición de clave foránea y añadir la clave foránea posteriormente utilizando la sentencia ALTER TABLE.