Articles

Definición de restricciones dentro de CREATE TABLE en Oracle 12c

Puede usar la instrucción CREATE TABLE para imponer varios tipos diferentes de restricciones en una tabla: claves candidatas, claves primarias, claves foráneas y condiciones de comprobación. Una cláusula de restricción puede restringir una sola columna o grupo de columnas de una tabla. El objetivo de estas restricciones es conseguir que Oracle haga la mayor parte del trabajo para mantener la integridad de su base de datos. Cuantas más restricciones agregue a la definición de una tabla, menos trabajo tendrá que hacer en las aplicaciones para mantener los datos. Por otro lado, cuantas más restricciones haya en una tabla, más tiempo se tardará en actualizar los datos.

Puede especificar restricciones de dos maneras: como parte de la definición de columna (conocida como restricción de columna) o al final de la instrucción CREATE TABLE (conocida como restricción de tabla). Las cláusulas que limitan varias columnas deben ser restricciones de tabla.

La clave Candidata

Una clave candidata es una combinación de una o más columnas, cuyos valores identifican de forma única cada fila de una tabla. La siguiente lista muestra la creación de una restricción ÚNICA para la tabla DE PROBLEMAS:

La clave para esta tabla es la combinación de CIUDAD y SAMPLE_DATE. Observe que ambas columnas también se declaran NO NULAS. Esta característica requiere que especifique valores para ciertas columnas para que se inserten filas. Claramente, la información sobre la temperatura y la precipitación no es útil sin saber dónde o cuándo se recopiló. Esta técnica es común para las columnas que son la clave principal de la tabla, pero también es útil si ciertas columnas son críticas para que la fila de datos sea significativa. Si no se especifica NOT NULL, la columna puede tener valores NULOS.

Al crear una restricción ÚNICA, Oracle crea un índice único para reforzar la singularidad de los valores. Dentro de una restricción de clave primaria, al menos una de las columnas de la clave primaria para cada fila NO debe ser NULA.

La Clave Principal

La clave principal de una tabla es uno de los candidatos claves que le dan unas características especiales. Solo puede tener una clave primaria, y una columna de clave primaria no puede contener NULOs.

La siguiente instrucción CREATE TABLE tiene el mismo efecto que la anterior, excepto que puede tener varias restricciones ÚNICAS pero solo una restricción de CLAVE PRIMARIA:

Para claves primarias o candidatas de una sola columna, puede definir la clave en la columna con una restricción de columna en lugar de una restricción de tabla:

En este caso, la columna AUTHOR_NAME es la clave principal y Oracle generará un nombre para la restricción de CLAVE PRINCIPAL. Esto no se recomienda si desea aplicar un estándar de nomenclatura común para las claves, como se explica más adelante en «Restricciones de nomenclatura».»

Espacios de tabla de índice de designación

Las restricciones de CLAVE ÚNICA y PRINCIPAL crean índices. A menos que se indique lo contrario a Oracle, esos índices se colocan en el espacio de tabla predeterminado. Para especificar un espacio de tabla diferente, utilice la cláusula USING INDEX TABLESPACE del comando CREATE TABLE, como se muestra en el siguiente listado:

El índice asociado a la restricción de clave primaria AUTHOR_PK se colocará en el espacio de tabla USUARIOS.

NOTA

En la mayoría de las instalaciones predeterminadas, se crea el espacio de tabla de USUARIOS y es el espacio de tabla predeterminado.

La clave foránea

Una clave foránea es una combinación de columnas con valores basados en los valores de la clave primaria de otra tabla. Una restricción de clave foránea, también conocida como restricción de integridad referencial, especifica que los valores de la clave foránea corresponden a los valores reales de la clave primaria en la otra tabla. En la tabla BOOKSHELF, por ejemplo, la columna CATEGORY_NAME hace referencia a los valores de la columna CATEGORY_NAME de la tabla de CATEGORÍAS:

Puede hacer referencia a una clave principal o única, incluso en la misma tabla. Sin embargo, no puede hacer referencia a una tabla de una base de datos remota en la cláusula REFERENCIAS. Puede usar el formulario de tabla (que se usa anteriormente para crear una CLAVE PRIMARIA en la tabla DE PROBLEMAS) en lugar del formulario de columna para especificar claves foráneas con varias columnas.

A veces es posible que desee eliminar estas filas dependientes cuando elimine la fila de la que dependen. En el caso de BOOKSHELF y CATEGORY, si elimina un CATEGORY_NAME de la CATEGORÍA, es posible que desee hacer que los valores de columna de BOOKSHELF CATEGORY_NAME coincidentes sean NULOS. En otro caso, es posible que desee eliminar toda la fila. La cláusula ELIMINAR CASCADA añadida a la cláusula REFERENCIAS indica a Oracle que elimine la fila dependiente cuando elimine la fila correspondiente de la tabla principal. Esta acción mantiene automáticamente la integridad referencial.

La restricción de COMPROBACIÓN

Muchas columnas deben tener valores que estén dentro de un cierto rango o que cumplan ciertas condiciones. Con una restricción de COMPROBACIÓN, puede especificar una expresión que siempre debe ser verdadera para cada fila de la tabla. Por ejemplo, la tabla DE CLASIFICACIÓN almacena clasificaciones válidas; para limitar los valores disponibles más allá de los límites impuestos por la definición de columna, puede usar una restricción de COMPROBACIÓN, como se muestra en el siguiente listado:

Una restricción de COMPROBACIÓN a nivel de columna no puede hacer referencia a valores en otras filas; no puede usar las pseudo columnas como SYSDATE, USER, CURRVAL, NEXTVAL, LEVEL y ROWNUM. Puede usar el formulario de restricción de tabla (en lugar del formulario de restricción de columna) para hacer referencia a varias columnas de una restricción de COMPROBACIÓN.

Restricciones de nombres

Puede nombrar sus restricciones. Si utiliza un esquema de nomenclatura eficaz para los nombres de sus restricciones, podrá identificar y administrar mejor las restricciones. El nombre de una restricción debe identificar la tabla en la que actúa y el tipo de restricción que representa. Por ejemplo, la clave principal de la tabla de PROBLEMAS podría llamarse TROUBLE_PK.

Puede especificar un nombre para una restricción al crear la restricción. Si no especifica un nombre para la restricción, Oracle genera un nombre. La mayoría de los nombres de restricción generados por Oracle son de la forma SYS_C###### (por ejemplo, SYS_C000145). Debido a que el nombre de restricción generado por el sistema no le dice nada sobre la tabla o la restricción, debe nombrar sus restricciones.

En el siguiente ejemplo, se crea y nombra la restricción de CLAVE PRIMARIA, como parte del comando CREATE TABLE para la tabla DE PROBLEMAS (observe la cláusula de RESTRICCIÓN):

La cláusula de restricción del comando CREATE TABLE nombra la restricción (en este caso, TROUBLE_PK). Puede usar este nombre de restricción más adelante al habilitar o deshabilitar restricciones.