Databases
T05-003 Claves ajenas
Enunciado
REFERENCES.Las claves ajenas o foráneas son campos de una tabla que se relacionaban con la clave primaria (o incluso con la clave candidata) de otra tabla.
Al crear la tabla, tendremos que indicar, de alguna forma, cuál es la clave ajena. Lo haremos "haciendo referencia" a la tabla y los atributos de donde procede.
En nuestra tabla vamos a tener una clave ajena procedente de la tabla PARTIDAS que será su Cod_Partida, por tanto tendremos que hacer referencia a éste:
CREATE TABLE USUARIOS ( Cod_Partida NUMBER(8) CONSTRAINT Cod_Part_FK REFERENCES PARTIDAS(Cod_Partida));Si el campo al que hace referencia es clave principal en su tabla no es necesario indicar el nombre del campo:
CREATE TABLE USUARIOS ( Cod_Partida NUMBER(8)CONSTRAINT Cod_Part_FK REFERENCES PARTIDAS);Al relacionar campos necesitamos que el dato del campo que es clave ajena en una tabla (que llamaremos secundaria) previamente haya sido incluido en su tabla de procedencia donde es clave primaria o candidata. En nuestro ejemplo, cualquier código de partida que incluyamos en la tabla USUARIO, debería estar previamente en la tabla de la que procede, es decir, en la tabla PARTIDAS. A esto se le llama Integridad Referencial.
Esto puede crear algunos errores, pues puede ocurrir lo siguiente:
- Si hacemos referencia a una tabla que no está creada: Oracle buscará la tabla referenciada y al no encontrarla dará fallo. Esto se soluciona creando en primer lugar las tablas que no tengan claves ajenas.
- Si queremos borrar las tablas tendremos que proceder al contrario, borraremos las tablas que tengan claves ajenas antes.
Ejercicio:
Supongamos que tenemos que almacenar datos de los MODULOS, según la siguiente definición:
CREATE TABLE MODULOS ( CODIGO NUMBER PRIMARY KEY, NOMBRE VARCHAR2 (100), DEPARTAMENTO CHAR(3) );La impartición de cada uno de esos MODULOS corresponde a uno de los DEPARTAMENTOS, cuyos datos se almacenan en la siguiente tabla:
CREATE TABLE DEPARTAMENTOS ( COD_DEPARTAMENTO CHAR(3) PRIMARY KEY, NOMBRE VARCHAR2(50) );Crea las tablas y relaciónalas a través de una clave ajena.
Tipo
Solución
CREATE TABLE DEPARTAMENTOS (
COD_DEPARTAMENTO CHAR(3) PRIMARY KEY,
NOMBRE VARCHAR2(50)
);
CREATE TABLE MODULOS (
CODIGO NUMBER PRIMARY KEY,
NOMBRE VARCHAR2 (100),
DEPARTAMENTO CHAR(3) REFERENCES DEPARTAMENTOS
);
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)
--

