Databases

T05-003 Claves ajenas

Enunciado

FOREIGN KEY.

Si la definición de la clave ajena se pone al final, tendremos que colocar el texto FOREIGN KEY para especificar a qué campo se está refiriendo.

En el caso en el que la clave ajena estuviera formada por más de un atributo, sería obligatorio que la restricción se colocara tras la definición de los atributos. Veamos un ejemplo con Cod_Partida y Fecha de la partida de la tabla PARTIDAS:

CREATE TABLE USUARIOS (
    Cod_Partida NUMBER(8),
    F_Partida DATE,
        CONSTRAINT Partida_Cod_F_FK FOREIGN KEY (Cod_Partida, F_Partida)
        REFERENCES PARTIDAS);

Tenemos otras soluciones y es añadir tras la cláusula REFERENCE:

  • ON DELETE CASCADE: te permitirá borrar todos los registros cuya clave ajena sea igual a la clave del registro borrado.
  • ON DELETE SET NULL: colocará el valor NULL en todas las claves ajenas relacionadas con la borrada.

Ejercicio:

Supongamos que tenemos que almacenar datos de los MODULOS, según la siguiente definición:

CREATE TABLE MODULOS (
    CODIGO NUMBER,
    NOMBRE VARCHAR2 (100),
    CICLO CHAR(3),
    PRIMARY KEY (CODIGO, CICLO)
);

Como material de apoyo, para cada módulo se hace uso de un libro de texto, cuyos datos se almacenarán en la siguiente tabla:

CREATE TABLE LIBROS (
    ISBN NUMBER PRIMARY KEY,
    TITULO VARCHAR2 (100),
    MODULO NUMBER,
    CICLO CHAR(3)
);

Crea las tablas y relaciónalas a través de una clave ajena.

Tipo

DDL

Solución


												
CREATE TABLE MODULOS ( CODIGO NUMBER, NOMBRE VARCHAR2 (100), CICLO CHAR(3), PRIMARY KEY (CODIGO, CICLO) ); CREATE TABLE LIBROS ( ISBN NUMBER PRIMARY KEY, TITULO VARCHAR2 (100), MODULO NUMBER, CICLO CHAR(3), FOREIGN KEY (MODULO, CICLO) REFERENCES MODULOS (CODIGO, CICLO) );

Prueba


											
SELECT USER_CONSTRAINTS.TABLE_NAME, STATUS, COLUMN_NAME, POSITION FROM USER_CONSTRAINTS JOIN USER_CONS_COLUMNS USING (CONSTRAINT_NAME) WHERE CONSTRAINT_TYPE = 'R';

Librerías (Onfly databases)


											
--