Claves, Constraints y References Ing. Gustavo Delgado Clave Primaria • Dept_tab – Tabla de departamentos • Deptno – Código del departamento, que debe ser único (regla de negocio) ALTER TABLE Dept_tab ADD PRIMARY KEY (Deptno); Clave Foranea • Dept_tab – Tabla de departamentos • Deptno – Código del departamento, que debe ser único (regla de negocio) • Emp_tab – Tabla de Empleados – Regla de Negocio: Cada departamento listado en la tabla de Empleados debe coincidir con un valor en la tabla de Departamentos. ALTER TABLE Emp_tab ADD FOREIGN KEY (Deptno) REFERENCES Dept_tab(Deptno); Clave Foranea • Oracle no genera índices automáticamente para claves foráneas • Podría ser conveniente generar indices para claves foráneas Restricción de No Nulo Restricción de No Nulo • La restricción de No Nulo puede prevenir que no se ingresen valores que deben ser obligatorios. • Regla de negocio: ename de la tabla Emp, debe tener siempre valores. ALTER TABLE emp MODIFY ename NOT NULL; Valor por Defecto • A las columnas de una tabla se les puede asignar un valor típico en caso que no se ingrese valor. CREATE TABLE audit_trail ( value1 NUMBER, value2 VARCHAR2(32), inserter VARCHAR2(30) DEFAULT USER ); Valor por Defecto • Los valores de DEFAULT pueden ser literales, expresiones o llamadas a funciones como: – SYSDATE .- Devuelve la fecha y hora actual – USER.- Devuelve el nombre de usuario de la sesión actual (VARCHAR2) – USERENV .- Devuelve información de la sesión actual – UID .- Devuelve un entero que identifica unívocamente a la sesión de usuario. Valor por Defecto • DEFAULT no puede tener: – Expresiones referidas a secuencias – Funciones PL/SQL – Columnas – LEVEL .- Devuelve el nivel en el árbol de búsqueda – ROWNUM .- Indica el número de orden en que Oracle selecciona las filas – PRIOR.- Hace referencia a la fila anterior. UNIQUE • Esta clausula es apropiada para las columnas cuyos valores no deben repetirse. • Se diferencian de las claves primarias, en que las claves primarias persiguen identificar los registros unívocamente. UNIQUE UNIQUE CREATE TABLE promotions_var1 ( promo_id NUMBER(6) CONSTRAINT promo_id_u UNIQUE , promo_name VARCHAR2(20) , promo_category VARCHAR2(15) , promo_cost NUMBER(10,2) , promo_begin_date DATE , promo_end_date DATE ); CHECK • Permite validar que las columnas cumplan ciertas reglas de negocio particulares. • Se pueden usar expresiones para validar los valores de una columna. CHECK CREATE TABLE divisions ( div_no NUMBER CONSTRAINT check_divno CHECK (div_no BETWEEN 10 AND 99) DISABLE, div_name VARCHAR2(9) CONSTRAINT check_divname CHECK (div_name = UPPER(div_name)) DISABLE, office VARCHAR2(10) CONSTRAINT check_office CHECK (office IN ('DALLAS','BOSTON', 'PARIS','TOKYO')) DISABLE ); CHECK CREATE TABLE dept_20 ( employee_id NUMBER(4) PRIMARY KEY, last_name VARCHAR2(10), job_id VARCHAR2(9), manager_id NUMBER(4), salary NUMBER(7,2), commission_pct NUMBER(7,2), department_id NUMBER(2), CONSTRAINT check_sal CHECK (salary * commission_pct <= 5000) ); CHECK CREATE TYPE person_name AS OBJECT ( first_name VARCHAR2(30), last_name VARCHAR2(30) ); / CREATE TABLE students ( name person_name, age INTEGER, CHECK (name.first_name IS NOT NULL AND name.last_name IS NOT NULL) ); Uso explicito de índices CREATE TABLE promotions_var3 ( promo_id NUMBER(6) , promo_name VARCHAR2(20) , promo_category VARCHAR2(15) , promo_cost NUMBER(10,2) , promo_begin_date DATE , promo_end_date DATE , CONSTRAINT promo_id_u UNIQUE (promo_id, promo_cost) USING INDEX (CREATE UNIQUE INDEX promo_ix1 ON promotions_var3 (promo_id, promo_cost)) , CONSTRAINT promo_id_u2 UNIQUE (promo_cost, promo_id) USING INDEX promo_ix1 ); Integridad Referencial Constraints Deferrable CREATE TABLE dept ( deptno NUMBER PRIMARY KEY, dname VARCHAR2 (30) ); CREATE TABLE emp ( empno NUMBER, ename VARCHAR2 (30), deptno NUMBER, CONSTRAINT epk PRIMARY KEY (empno) DEFERRABLE, CONSTRAINT efk FOREIGN KEY (deptno) REFERENCES dept(deptno) DEFERRABLE ); Constraints Deferrable INSERT INTO dept VALUES (10, 'Accounting'); INSERT INTO dept VALUES (20, 'SALES'); INSERT INTO emp VALUES (1, 'Corleone', 10); INSERT INTO emp VALUES (2, 'Costanza', 20); COMMIT; Constraints Deferrable Integridad Referencial