Restricciones referenciales
Db2 garantiza la integridad referencial entre sus tablas cuando define restricciones referenciales.
Integridad de referencia es el estado en que todos los valores de todas las claves foráneas son válidos. La integridad de referencia está basada en la integridad de entidad. La integridad de entidad necesita que cada entidad tenga una clave exclusiva. Por ejemplo, si cada fila de una tabla representa relaciones para una entidad exclusiva, la tabla debería tener una columna o un conjunto de columnas que proporcione un identificador exclusivo para las filas de la tabla. Esta columna (o conjunto de columnas) se denomina clave padre de la tabla. Para asegurar que la clave padre no contenga valores duplicados, debe definirse un índice exclusivo en la columna o columnas que forman la clave padre. La definición de la clave padre se denomina integridad de entidad.
Una restricción de referencia es la regla de que los valores no nulos de una clave foránea sólo son válidos si también aparecen como valores de una clave padre. La tabla que contiene la clave padre se denomina tabla padre de la restricción de referencia y la tabla que contiene la clave foránea es una tabla dependiente de dicha tabla.
La relación entre algunas filas de las tablas DEPT y EMP, que se muestran en la siguiente figura, ilustra los conceptos y terminología de integridad de referencia. Por ejemplo, la integridad de referencia asegura que cada valor de clave foránea de la columna DEPT de la tabla EMP coincide con un valor de clave primaria de la columna DEPTNO de la tabla DEPT.
Existen dos relaciones entre padre y dependiente entre las tablas DEPT y EMP.
- La clave foránea de la columna DEPT establece una relación entre padre y dependiente. La columna DEPT de la tabla EMP depende del DEPTNO de la tabla DEPT. Según esta relación de clave foránea, la tabla DEPT es la tabla padre de la tabla EMP. Puede asignar un empleado a ningún departamento (especificando un valor nulo), no puede asignar un empleado a un departamento que no exista.
- La clave foránea de la columna MGRNO también establece una relación entre padre y dependiente. Debido a que MGRNO depende de EMPNO, EMP es la tabla padre de la relación y DEPT es la tabla dependiente.
Puede definir una clave primaria en una o más columnas. Una clave primaria que incluye dos o más columnas se denomina clave compuesta. Una clave foránea también puede incluir una o más columnas. Cuando una clave foránea contiene varias columnas, la clave primaria correspondiente debe ser una clave compuesta. El número de columnas de clave foránea debe ser igual al número de columnas de la clave padre y los tipos de datos de las columnas correspondientes deben ser compatibles. (La tabla de actividad del proyecto de muestra, DSN8C10.PROJACT, es un ejemplo de una tabla con una clave principal en varias columnas, PROJNO, ACTNO y ACSTDATE).
Una tabla puede depender de sí misma; este tipo de tabla se denomina tabla de autorreferencia. Por ejemplo, la tabla DEPT es una tabla de autorreferencia debido a que el valor del departamento administrativo (ADMRDEPT) debe ser un ID de departamento (DEPTNO). Para imponer la restricción de autorreferencia, Db2 requiere que se defina una clave foránea.
Una terminología similar se aplica a las filas de una relación padre-hijo. Una fila de una tabla dependiente, denominada fila dependiente, hace referencia a una fila de una tabla padre, denominada fila padre. Pero una fila de una tabla padre no siempre es una fila padre (quizás nada hace referencia a ella). De forma similar, una fila de una tabla dependiente no siempre es una fila dependiente (la clave foránea puede permitir valores nulos, que no hacen referencia a ninguna otra fila).
Las restricciones de referencia son opcionales. Las restricciones de referencia se definen utilizando sentencias CREATE TABLE y ALTER TABLE.
Db2 impone restricciones referenciales cuando se producen las siguientes acciones:
- Se aplica una sentencia INSERT a una tabla dependiente.
- Se aplica una sentencia UPDATE a una clave foránea de una tabla dependiente o a la clave padre de una tabla padre.
- Se aplica una sentencia MERGE que incluye una operación de inserción a una tabla dependiente.
- Se aplica una sentencia MERGE que incluye una operación de actualización a una clave foránea de una tabla dependiente o a la clave padre de una tabla padre.
- Se aplica una sentencia DELETE a una tabla padre. Todas las restricciones de referencia y afectadas y todas las reglas de supresión de todas las relaciones afectadas se deben cumplir para que la operación de supresión se realice correctamente.
- Se ejecuta el programa de utilidad de carga con la opción ENFORCE CONSTRAINTS en una tabla dependiente.
- Se ejecuta el programa de utilidad CHECK DATA.
Otro tipo de restricción de referencia es una restricción de referencia informativa. Db2 no aplica este tipo de restricción durante las operaciones normales. Un proceso de proceso de aplicaciones debe verificar los datos de la relación de integridad de referencia. Una restricción de referencia informativa permite que las consultas aprovechen las ventajas de tablas de consultas materializadas.
El orden en que se aplican las restricciones de referencia no está definido. Para asegurarse de que el orden no afecta al resultado de la operación, existen restricciones en la definición de las reglas de supresión y en el uso de determinadas sentencias. Las restricciones se especifican en las descripciones de las siguientes sentencias de SQL: CREATE TABLE, ALTER TABLE, INSERT, UPDATE, MERGE y DELETE.
- clave padre
- Una clave primaria o una clave exclusiva que se utiliza en una restricción de referencia.
- tabla padre
- Tabla que es padre en una restricción referencial como mínimo. Una tabla puede definirse como padre en un número arbitrario de restricciones de referencia.
- tabla dependiente
- Una tabla que es una tabla dependiente de al menos una restricción de referencia. Una tabla puede definirse como dependiente en un número arbitrario de restricciones de referencia. Una tabla dependiente también puede ser una tabla padre.
- tabla descendente
- Una tabla que depende de otra tabla o una tabla que depende de una tabla descendente.
- ciclo referencial
- Conjunto de restricciones de referencia en el que cada tabla asociada es descendiente de si misma.
- fila padre
- Fila que tiene como mínimo una fila dependiente.
- fila dependiente
- Fila que tiene como mínimo una fila padre.
- fila descendente
- Fila que es dependiente de otra fila o fila que depende de una fila descendente.
- fila con referencia a si misma
- Fila que es padre de sí misma.
- tabla con referencia a si misma
- Tabla que es al mismo tiempo tabla padre y dependiente en la misma restricción de referencia. La restricción se denomina una restricción de autorreferencia.
Se puede definir una restricción referencial temporal para un tabla que contiene un periodo BUSINESS_TIME. La cláusula PERIOD BUSINESS_TIME se utiliza en la cláusula FOREIGN KEY y en la cláusula REFERENCES para indicar que no debe haber una fila en la tabla hijo en la que el periodo de tiempo que representa el valor del periodo BUSINESS_TIME de dicha fila no esté contenido en el periodo BUSINESS_TIME de una o varias filas correspondientes de la tabla padre. A diferencia de las restricciones referenciales normales, no es necesario que exista una fila correspondiente en la tabla padre, en la que el periodo BUSINESS_TIME contenga el periodo BUSINESS_TIME de la fila hijo. Siempre que el periodo BUSINESS_TIME de una fila de tabla hijo esté contenido en la unión de los periodos BUSINESS_TIME de dos o más filas contiguas coincidentes de la tabla padre, se cumple con la restricción referencial temporal.
- Un índice exclusivo en la tabla padre con la cláusula BUSINESS_TIME WITHOUT OVERLAPS.
- Un índice no exclusivo en la tabla hijo con la cláusula BUSINESS_TIME WITH OVERLAPS. De forma alternativa, se puede definir el índice en la tabla hijo sin la cláusula BUSINESS_TIME WITH OVERLAPS si el final de la clave de índice incluye la columna final seguida por la columna inicial del periodo BUSINESS_TIME (ambas en orden ascendente).
- norma de inserción
- Un valor de inserción de no nulos de una clave foránea debe coincidir con algún valor de la clave padre de la tabla padre. El valor de una clave foránea compuesta es nulo si cualquier componente del valor es nulo.
- norma de actualización
- Un valor de actualización de no nulos de la clave foránea debe coincidir con algún valor de la clave padre de la tabla padre. El valor de la clave foránea compuesta se trata como nulo si algún componente del valor es nulo.
- norma de supresión
- Controla qué sucede cuando una fila de la tabla padre se suprime. Las opciones de acción, realizadas cuando se define la restricción de referencia, son NO ACTION, RESTRICT CASCADE o SET NULL. Solo debe especificarse SET NULL si alguna columna de las claves foráneas permita valores nulos.
Para ser más exactos, la norma supresión se aplica cuando una fila de la tabla padre es el objeto de una operación de supresión o de supresión propagada y esa fila tiene dependientes en la tabla dependiente de la restricción de referencia. Una supresión propagada hace referencia a la situación en la que las filas dependientes se suprimen cuando se suprimen las filas padre. Supongamos que la tabla padre es P, que la tabla dependiente es D y que p es una fila padre que es el objeto de una operación de supresión o de supresión propagada. Si la norma de supresión es:
- RESTRICT o NO ACTION, se produce un error y no se suprime ninguna fila.
- CASCADE, la operación de supresión se propaga a las filas dependientes de p en D.
- SET NULL, cada columna con posibilidad de nulos de la clave foránea de cada fila dependiente de p en D se establece en nulos.
Cada restricción de referencia en la que una tabla es un padre tiene su propia norma de supresión, y todas las normas de supresión aplicables se utilizan para determinar el resultado de una operación de supresión. De este modo, una fila no puede suprimirse si tiene dependientes en una restricción de referencia con una norma de supresión RESTRICT o NO ACTION o la supresión se propaga en cascada a cualquiera de sus descendientes que sean dependientes de una restricción de referencia con la norma de supresión RESTRICT o NO ACTION.
La supresión de una fila de la tabla padre P implica a otras tablas y puede afectar a las filas de dichas tablas:
- Si D es dependiente de P y la norma de supresión es RESTRICT o NO ACTION, D estará implicada en la operación pero no se verá afectada por la operación y la supresión desde la tabla padre P no se llevará a cabo.
- Si D es dependiente de P y la norma de supresión es SET NULL, D estará implicada en la operación y las filas de D pueden actualizarse durante la operación.
- Si D es dependiente de P y la norma de supresión es CASCADE, D estará implicada en la operación y las filas de D pueden suprimirse durante la operación. Si se suprimen filas de D, la operación de supresión en P se propaga a D. Si D es también una tabla padre, se aplican las acciones descritas en esta lista, a su vez, a los elementos dependientes de D.
Se dice que cualquier tabla que pueda estar implicada en una operación de supresión en P está conectada por supresión a P. Por lo tanto, una tabla está conectada por supresión a la tabla P si es dependiente de P o dependiente de una tabla en la que se suprimen las operaciones de P en cascada.