You are on page 1of 5

CONSTRAINTS

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.

Ejemplo:
Nombre_col VARCHAR2(50) CONSTRAINT nombre_unique UNIQUE

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);

ALTER TABLE insured_autos


ADD CONSTRAINT uniq_autos
UNIQUE (policy_id, vin);

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.