Las constraints son las encargadas de asegurar la integridad
referencial en la base de datos. Tipos de constraints: • CHECK • NOT NULL • UNIQUE KEY • PRIMARY KEY • FOREIGN KEY
Las constraints existen sólo en el diccionario de datos y son aplicadas
(o comprobadas) durante la ejecución del SQL o PL/SQL. Cuando están habilitadas, las constraints están aseguradas. Si no están habilitadas, no tienen porque cumplirse, pero siguen en el diccionario de datos.
ALTER TABLE table_name ENABLE CONSTRAINT const_name;
ALTER TABLE table_name DISABLE CONSTRAINT const_name;
Para eliminar una constraint, utilizamos el ALTER TABLE:
ALTER TABLE table_name DROP CONSTRAINT const_name;
ALTER TABLE table_name DROP PRIMARY KEY;
Check constraints
Este tipo de constraints son usadas para asegurar reglas simples de
negocio sobre el contenido de los datos en las tablas.
Los check pueden referenciar a otras columnas en la fila que está
siendo chequeada, pero no pueden referenciar a otras filas o a otras tablas, o llamar a funciones como SYSDATE, UID, USER o USERENV.
No se puede asociar una check a una columna de tipo LOB, object,
nested table, VARRAY o REF. Una columna puede estar protegida por más de una constraint y una check puede proteger a más de una columna.
En el CREATE TABLE: CONSTRAINT [constraint_name] CHECK (condition);
El nombre de la constraint no es obligatorio. Si no se especifica, se
creará un nombre único que comience por SYS_ CREATE TABLE persona ( Codigo NUMBER, Sexo VARCHAR2(1) CONTRAINT chk_genero CHECK (genero in (‘H’,’M’)), Estado VARCHAR2(1), Nombre VARCHAR2(200), CONSTRAINT chk_estado CHECK (estado in (‘S’, ‘C’, ‘D’, ‘V’)) );
Se debe especificar al final si la check involucra a más de una
columna.
Constraint NOT NULL
Se aplica a una columna y requiere valores para la columna que
protege. Por defecto, Oracle pone a NULL la columnas no introducidas de la tabla.
CREATE TABLE persona (
Nombre VARCHAR2(200) NOT NULL );
La constraint NOT NULL aparece en la vista del diccionario de datos
DBA_CONSTRAINTS como una check. Si se crea inline, además aparecerá en la vista DBA_TAB_COLUMNS como una atributo de columna. Para eliminar la constraint:
ALTER TABLE persona MODIFY nombre NULL;
Unique constraint
Una constraint unique protege a una o más columnas de una tabla,
asegurando que no hay dos filas que contengan información duplicada en las columnas aseguradas.
Si la constraint UNIQUE protege dos o más columnas, ésta debe ser
añadida al final de la tabla. Las constraints UNIQUE generan un índice B-TREE. Podemos indicar donde (tablespace) y con que condiciones se almacenará el índice.
CREATE TABLE insured_autos (
Policiy_id NUMBER, Vin VARCHAR2(40), Coverage_begin DATE, Coverage_term NUMBER, CONSTRAINT uniq_auto UNIQUE (policy_id, vin) USING INDEX TABLESPACE indx STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0) );
Para eliminar una únique:
ALTER TABLE insured_autos DROP CONSTRAINT uniq_auto;
No se puede borrar una UNIQUE de una tabla si ésta está apuntada
por una foreign key. Pasos: 1. Deshabilitar la foreign 2. Borrar la únique
Si eliminamos la UNIQUE, eliminamos el índice asociado. Esto es,
eliminando la constraint podemos hacer que el rendimiento de las consultas baje. Lo que debemos hacer es: 1. Crear un índice no único sobre la/s columna/s que la UNIQUE debe proteger 2. Crear la CONSTRAINT
La UNIQUE no creará un segundo índice.
CREATE INDEX insured_autos_u1
ON insured_autos (policy_id, vin) TABLESPACE indx STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0);
El problema de esta solución es que las búsquedas serán “un poco”
peores, ya que las búsquedas se harán por RANGE SCAN y no por UNIQUE SCAN. Foreign keys
Una foreign key protege una o más columnas de una tabla,
asegurando que cada valor de la fila es, o bien nulo en su conjunto, o bien apunta a un valor de una clave única o primaria. No se genera un B-TREE al crear la constraint.
Siempre, al hablar de claves externas, foráneas o extranjeras, se
mencionan dos términos: parent table o tabla maestra y child table o tabla detalle.
Tabla maestra. Tabla referenciada. Es la que tiene la primary o la
unique Tabla detalle. La tabla donde se encuentra la referencia. L a que es chequeada para garantizar que sus valores se corresponden con los de la tabla maestra
La integridad referencial está basada en las foreign keys
CREATE TABLE coche_asegurado (
Numero_matricula NUMBER, Letras_matricula VARCHAR2(3), Poliza NUMBER CONSTRAINT poliza_fk REFERENCES polizas (codigo_poliza) ON DELETE CASCADE, … RESTO DE CAMPOS DE LA TABLA, CONSTRAINT coche_fk FOREIGN KEY (numero_matricula, letras_matricula) REFERENCES coche (numero, letra) ON DELETE SET NULL -- Si la foreign afecta a más de una columna, debe especificarse así );
La cláusula ON DELETE le dice a Oracle como comportarse si se borra
el registro “padre”:
1. Si no se especifica nada, por defecto saltará un error
2. CASCADE. Borrará los registros hijo 3. SET NULL. Pondrá los campos del registro hijo a null Deferred constraint checking
1. Immediate. Por defecto. La constraint se valida en el momento
en el que se produce la acción. 2. Deferred. La constraint se valida al finalizar la transacción.
La ejecución en Oracle se basa en un criterio optimista. Esto es, el
chequeo se realiza siempre después de: 1. Insertar los valores en el segmento de rollback 2. Modificar los valores de las tablas 3. Modificar los valores de los índices
Si sabemos que hay muchas posibilidades de que el programa falle, lo
mejor es garantizarlo por programa, no esperar a que salte la constraint.