Una clave foránea es un conjunto de atributos en una tabla que hace referencia a la clave primaria de otra tabla, vinculando así estas dos tablas. En el contexto de las bases de datos relacionales , una clave foránea está sujeta a una restricción de dependencia de inclusión : las tuplas que consisten en los atributos de la clave foránea en una relación R también deben existir en alguna otra relación (no necesariamente distinta) S; además, esos atributos también deben ser una clave candidata en S. [ 1 ] [ 2 ] [ 3 ]
En otras palabras, una clave foránea es un conjunto de atributos que hace referencia a una clave candidata. Por ejemplo, una tabla llamada EQUIPO puede tener un atributo, NOMBRE_MIEMBRO, que es una clave foránea que hace referencia a una clave candidata, NOMBRE_PERSONA, en la tabla PERSONA. Dado que NOMBRE_MIEMBRO es una clave foránea, cualquier valor que exista como nombre de un miembro en EQUIPO también debe existir como nombre de una persona en la tabla PERSONA; en otras palabras, cada miembro de un EQUIPO también es una PERSONA.
Resumen
La tabla que contiene la clave externa se denomina tabla hija, y la tabla que contiene la clave candidata se denomina tabla referenciada o padre. [ 4 ] En el modelado e implementación relacional de bases de datos, una clave candidata es un conjunto de cero o más atributos, cuyos valores están garantizados como únicos para cada tupla (fila) en una relación. El valor o la combinación de valores de los atributos de la clave candidata para cualquier tupla no puede duplicarse para ninguna otra tupla en esa relación.
Dado que el propósito de la clave foránea es identificar una fila específica de la tabla referenciada, generalmente se requiere que la clave foránea sea igual a la clave candidata en alguna fila de la tabla primaria, o bien que no tenga valor ( valor NULL . [ 2 ] ). Esta regla se denomina restricción de integridad referencial entre las dos tablas. [ 5 ] Debido a que las violaciones de estas restricciones pueden ser la causa de muchos problemas en las bases de datos, la mayoría de los sistemas de gestión de bases de datos proporcionan mecanismos para garantizar que cada clave foránea no nula corresponda a una fila de la tabla referenciada. [ 6 ] [ 7 ] [ 8 ]
Por ejemplo, consideremos una base de datos con dos tablas: una tabla CLIENTE que incluye todos los datos de los clientes y una tabla PEDIDOS que incluye todos los pedidos de los clientes. Supongamos que la empresa requiere que cada pedido se refiera a un único cliente. Para reflejar esto en la base de datos, se agrega una columna de clave externa a la tabla PEDIDOS (por ejemplo, IDCLIENTE), que hace referencia a la clave primaria de CLIENTE (por ejemplo, ID). Dado que la clave primaria de una tabla debe ser única, y dado que IDCLIENTE solo contiene valores de ese campo de clave primaria, podemos asumir que, cuando tiene un valor, IDCLIENTE identificará al cliente específico que realizó el pedido. Sin embargo, esto ya no se puede asumir si la tabla PEDIDOS no se mantiene actualizada cuando se eliminan filas de la tabla CLIENTE o se modifica la columna ID, y trabajar con estas tablas puede volverse más difícil. Muchas bases de datos reales solucionan este problema "inactivando" en lugar de eliminar físicamente las claves externas de la tabla maestra, o mediante programas de actualización complejos que modifican todas las referencias a una clave externa cuando se necesita un cambio.
Las claves foráneas desempeñan un papel esencial en el diseño de bases de datos . Una parte importante del diseño de bases de datos es asegurar que las relaciones entre entidades del mundo real se reflejen en la base de datos mediante referencias, utilizando claves foráneas para hacer referencia de una tabla a otra. [ 9 ] Otra parte importante del diseño de bases de datos es la normalización de la base de datos , en la que las tablas se dividen y las claves foráneas permiten reconstruirlas. [ 10 ]
Varias filas de la tabla de referencia (o tabla hija) pueden hacer referencia a la misma fila de la tabla referenciada (o tabla padre). En este caso, la relación entre las dos tablas se denomina relación de uno a muchos .
Además, la tabla hija y la tabla padre pueden ser, de hecho, la misma tabla; es decir, la clave externa hace referencia a la misma tabla. Este tipo de clave externa se conoce en SQL:2003 como clave externa autorreferencial o recursiva. En los sistemas de gestión de bases de datos, esto se suele lograr vinculando una primera y una segunda referencia a la misma tabla.
Una tabla puede tener múltiples claves foráneas, y cada clave foránea puede tener una tabla padre diferente. El sistema de base de datos aplica cada clave foránea de forma independiente . Por lo tanto, se pueden establecer relaciones en cascada entre tablas mediante claves foráneas.
Una clave externa se define como un atributo o conjunto de atributos en una relación cuyos valores coinciden con una clave primaria en otra relación. La sintaxis para agregar dicha restricción a una tabla existente se define en SQL:2003 , como se muestra a continuación. Omitir la lista de columnas en la REFERENCEScláusula implica que la clave externa debe hacer referencia a la clave primaria de la tabla referenciada. Asimismo, las claves externas pueden definirse como parte de la CREATE TABLEsentencia SQL.
CREATE TABLE child_table ( col1 INTEGER PRIMARY KEY , col2 CHARACTER VARYING ( 20 ), col3 INTEGER , col4 INTEGER , FOREIGN KEY ( col3 , col4 ) REFERENCES parent_table ( col1 , col2 ) ON DELETE CASCADE )Si la clave externa es una sola columna, se puede marcar como tal utilizando la siguiente sintaxis:
CREATE TABLE child_table ( col1 INTEGER PRIMARY KEY , col2 CHARACTER VARYING ( 20 ), col3 INTEGER , col4 INTEGER REFERENCES parent_table ( col1 ) ON DELETE CASCADE )Las claves foráneas se pueden definir mediante una instrucción de procedimiento almacenado .
sp_foreignkey child_table , parent_table , col3 , col4- child_table : el nombre de la tabla o vista que contiene la clave foránea que se va a definir.
- tabla_parent : el nombre de la tabla o vista que contiene la clave primaria a la que se aplica la clave externa. La clave primaria debe estar definida previamente.
- col3 y col4 : nombres de las columnas que componen la clave foránea. La clave foránea debe tener al menos una columna y como máximo ocho.
Acciones referenciales
Dado que el sistema de gestión de bases de datos impone restricciones referenciales, debe garantizar la integridad de los datos si se van a eliminar (o actualizar) filas en una tabla referenciada. Si aún existen filas dependientes en las tablas que hacen referencia a la tabla referenciada, dichas referencias deben tenerse en cuenta. SQL:2003 especifica cinco acciones referenciales diferentes que deben llevarse a cabo en tales casos:
CASCADA
Cuando se eliminan (o actualizan) filas de la tabla principal (de referencia), las filas correspondientes de la tabla secundaria (de referencia) que tengan una columna de clave externa coincidente también se eliminarán (o actualizarán). Esto se denomina eliminación (o actualización) en cascada.
RESTRINGIR
No se puede actualizar ni eliminar un valor cuando existe una fila en una tabla de referencia o tabla secundaria que hace referencia al valor de la tabla referenciada.
Del mismo modo, no se puede eliminar una fila mientras exista una referencia a ella desde una tabla de referencia o una tabla hija.
Para comprender mejor RESTRICT (y CASCADE), conviene tener en cuenta la siguiente diferencia, que quizás no resulte evidente a primera vista. La acción referencial CASCADE modifica el comportamiento de la tabla (hija) donde se utiliza la palabra CASCADE. Por ejemplo, ON DELETE CASCADE indica, en la práctica, «Cuando se elimine la fila referenciada de la otra tabla (tabla maestra), elimínela también de esta tabla ». Sin embargo, la acción referencial RESTRICT modifica el comportamiento de la tabla maestra, no de la tabla hija, aunque la palabra RESTRICT aparezca en la tabla hija y no en la maestra. Por lo tanto, ON DELETE RESTRICT indica, en la práctica, «Cuando alguien intente eliminar la fila de la otra tabla (tabla maestra), impida su eliminación de esa otra tabla (y, por supuesto, tampoco la elimine de esta tabla, pero ese no es el punto principal)».
La cláusula RESTRICT no es compatible con Microsoft SQL Server 2012 ni versiones anteriores.
NO SE TOMA NINGUNA MEDIDA
Las acciones NO ACTION y RESTRICT son muy similares. La principal diferencia radica en que, con NO ACTION, la comprobación de integridad referencial se realiza después de intentar modificar la tabla. RESTRICT, en cambio, realiza la comprobación antes de ejecutar la instrucción UPDATE o DELETE . Ambas acciones referenciales se comportan de la misma manera si la comprobación de integridad referencial falla: la instrucción UPDATE o DELETE generará un error.
En otras palabras, cuando se ejecuta una instrucción UPDATE o DELETE en la tabla referenciada utilizando la acción referencial NO ACTION, el sistema de gestión de bases de datos (DBMS) verifica al final de la ejecución que no se haya violado ninguna de las relaciones referenciales. Esto difiere de RESTRICT, que asume desde el principio que la operación violará la restricción. Al usar NO ACTION, los disparadores o la semántica de la propia instrucción pueden generar un estado final en el que no se violen las relaciones de clave externa cuando finalmente se comprueba la restricción, lo que permite que la instrucción se complete correctamente.
ESTABLECER NULO, ESTABLECER PREDETERMINADO
En general, la acción que realiza el DBMS para SET NULL o SET DEFAULT es la misma tanto para ON DELETE como para ON UPDATE: el valor de los atributos de referencia afectados se cambia a NULL para SET NULL y al valor predeterminado especificado para SET DEFAULT.
Desencadenantes
Las acciones referenciales generalmente se implementan como disparadores implícitos (es decir, disparadores con nombres generados por el sistema, a menudo ocultos). Por lo tanto, están sujetas a las mismas limitaciones que los disparadores definidos por el usuario, y puede ser necesario considerar su orden de ejecución en relación con otros disparadores; en algunos casos, puede ser necesario reemplazar la acción referencial con su disparador equivalente definido por el usuario para garantizar el orden de ejecución adecuado o para sortear las limitaciones de las tablas en constante mutación.
Otra limitación importante surge con el aislamiento de transacciones : es posible que los cambios realizados en una fila no se propaguen completamente porque la fila está referenciada por datos que la transacción no puede "ver" y, por lo tanto, no puede aplicar cambios en cascada. Por ejemplo: mientras una transacción intenta renumerar una cuenta de cliente, otra transacción simultánea intenta crear una nueva factura para ese mismo cliente. Si bien una regla CASCADE puede corregir todas las filas de factura que la transacción puede ver para mantenerlas consistentes con la fila del cliente renumerada, no podrá acceder a la otra transacción para corregir los datos allí. Dado que la base de datos no puede garantizar la consistencia de los datos cuando las dos transacciones se confirman, una de ellas se verá obligada a revertirse (a menudo según el principio de "primero en llegar, primero en ser atendido").
CREATE TABLE account ( acct_num INT , amount DECIMAL ( 10 , 2 ));CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @ sum = @ sum + NEW . amount ;Ejemplo
Como primer ejemplo para ilustrar las claves foráneas, supongamos que una base de datos de cuentas tiene una tabla con facturas, donde cada factura está asociada a un proveedor específico. Los datos del proveedor (como nombre y dirección) se almacenan en una tabla aparte; a cada proveedor se le asigna un número de proveedor para identificarlo. Cada registro de factura tiene un atributo que contiene el número de proveedor correspondiente. Este número de proveedor es la clave primaria en la tabla de Proveedores. La clave foránea en la tabla de Facturas apunta a dicha clave primaria. El esquema relacional es el siguiente. Las claves primarias están resaltadas en negrita y las claves foráneas en cursiva.
Proveedor ( Número de proveedor , Nombre, Dirección) Factura ( Número de factura , Texto, Número de proveedor )
La instrucción correspondiente en el lenguaje de definición de datos es la siguiente.
CREATE TABLE Supplier ( SupplierNumber INTEGER NOT NULL , Name VARCHAR ( 20 ) NOT NULL , Address VARCHAR ( 50 ) NOT NULL , CONSTRAINT supplier_pk PRIMARY KEY ( SupplierNumber ), CONSTRAINT number_value CHECK ( SupplierNumber > 0 ) )CREATE TABLE Invoice ( InvoiceNumber INTEGER NOT NULL , Text VARCHAR ( 4096 ), SupplierNumber INTEGER NOT NULL , CONSTRAINT invoice_pk PRIMARY KEY ( InvoiceNumber ), CONSTRAINT inumber_value CHECK ( InvoiceNumber > 0 ), CONSTRAINT supplier_fk FOREIGN KEY ( SupplierNumber ) REFERENCES Supplier ( SupplierNumber ) ON UPDATE CASCADE ON DELETE RESTRICT )Véase también
Referencias
- ↑ Coronel, Carlos (2010). Sistemas de bases de datos: diseño, implementación y gestión . Independence, KY: South-Western/Cengage Learning. pág. 65. ISBN 978-0-538-74884-1.
- 1 2 Elmasri, Ramez (2011). Fundamentos de los sistemas de bases de datos . Addison-Wesley. pp. 73–74 . ISBN 978-0-13-608620-8.
- ↑ Date, CJ (1996). Guía del estándar SQL . Addison-Wesley. pág. 206. ISBN 978-0201964264.
- ↑ Sheldon, Robert (2005). Introducción a MySQL . John Wiley & Sons. págs. 119–122 . ISBN 0-7645-7950-9.
- ↑ "Conceptos básicos de bases de datos : claves foráneas" . Consultado el 13 de marzo de 2010 .
- ↑ MySQL AB (2006). Guía del administrador de MySQL y referencia del lenguaje . Sams Publishing. pág. 40. ISBN 0-672-32870-4.
- ↑ Powell, Gavin (2004). Oracle SQL: Jumpstart with Examples . Elsevier. p. 11 . ASIN B008IU3AHY .
- ↑ Mullins, Craig (2012). Guía del desarrollador de DB2 . IBM Press. ASIN B007Y6K9TK .
- ↑ Sheldon, Robert (2005). Introducción a MySQL . John Wiley & Sons. pág. 156. ISBN 0-7645-7950-9.
- ↑ García-Molina, Héctor (2009). Sistemas de bases de datos: El libro completo . Prentice Hall. págs. 93-95 . ISBN 978-0-13-187325-4.
Enlaces externos
- Claves foráneas SQL-99
- Claves foráneas de PostgreSQL
- Claves foráneas de MySQL
- Claves primarias de FirebirdSQL
- Compatibilidad de SQLite con claves foráneas
- Restricción de tabla de Microsoft SQL 2012 (Transact-SQL)
- Modelado de datos
- Bases de datos
- SQL
- Sistemas de gestión de bases de datos