Está en la página 1de 5

SESIÓN 6 – GESTIÓN DE TABLAS

1) Crear las siguientes tablas correspondientes a una base de datos con información
sobre los empleados y proyectos de una empresa:

EMPLEADO (DNI, Nombre, Apellidos, FechaAlta, Salario)


PROYECTO (Codigo, Nombre, Presupuesto, FechaInicio, FechaFin)
TRABAJA_EN (DNI, Cod_Proy, Horas)

Teniendo en cuenta las siguientes restricciones:

 Los atributos DNI y Codigo de proyecto son de tipo entero.


 Los atributos que aparecen subrayados son las claves primarias de cada
relación.
 Ningún atributo de la tabla EMPLEADO podrá tener un valor nulo.
 No se permitirá que dos empleados coincidan en nombre y apellidos.
 Por defecto, la fecha de alta de un empleado se tomará como la fecha en la
que se inserte la tupla correspondiente al empleado.
 El salario será siempre una cantidad entera entre 14400 y 45000. Por defecto
se asignará un valor de 20000 si no se proporciona uno específico en el
momento de dar el alta.
 Los atributos Presupuesto, FechaIncio y FechaFin de la tabla PROYECTO
podrán tener un valor nulo. El resto de los atributos de esa tabla serán
siempre no nulos.
 No se permite que dos proyectos tengan el mismo nombre.
 Por defecto, el atributo FechaInicio tomará el valor correspondiente a la
fecha en la que se inserte la tupla en la tabla PROYECTO.
 El número de horas que un empleado trabaja en cada proyecto será siempre
un valor no nulo comprendido entre 10 y 40. Por defecto se asignará el valor
10.

CREATE TABLE EMPLEADO (

DNI integer not null primary key,

Nombre varchar(30) not null,

Apellidos varchar(50) not null,

FechaAlta date default sysdate not null,

Salario decimal (7,2) default 20000 not null,

check (Salario >= 14400 and Salario <= 45000),

constraint EMP_UNIQ unique (Nombre,Apellidos)

);

Damos el nombre EMP_UNIQ a la última restricción para que sea más sencillo
eliminarla después. ¡¡NO ES OBLIGATORIO!!
CREATE TABLE PROYECTO (

Codigo integer not null primary key,

Nombre varchar(30) unique not null,

Presupuesto decimal (9,2),

FechaInicio date default sysdate,

FechaFin date

);

CREATE TABLE TRABAJA_EN (

DNI integer not null references empleado,

Cod_Proy integer not null references proyecto,

Horas integer default 10 not null check (Horas >= 10 and Horas <= 40),

primary key (DNI,Cod_Proy)

);

OTRA FORMA DE PONER LAS CLAVES EXTERNAS EN TRABAJA_EN

Sabemos que las restricciones primary key, unique, foreign key y check pueden hacerse de dos
maneras:
- A nivel de columna, cuando la restricción afecta solo a una columna. Se pone la
restricción en la definición de la columna afectada.
- A nivel de tabla. Obligatoriamente si la restricción afecta a más de una columna y
opcionalmente si afecta solo a una. Se pone la restricción aparte de las definiciones
de la/s columna/s afectada/s.

Por ejemplo, en la tabla TRABAJA_EN, la restricción de clave primaria afecta a dos columnas y
se tiene que poner obligatoriamente nivel de tabla pero la restricción DNI es clave externa
sobre EMPLEADO afecta solo a la columna DNI, por lo que podemos elegir entre:

- Definirla a nivel de columna, como está hecho en la sentencia anterior de creación


de la tabla.
- Definirla a nivel de tabla, como está hecho en la sentencia de creación de la misma
tabla escrita a continuación. En esta sentencia hemos definido las dos claves
externas de la tabla a nivel de tabla.

CREATE TABLE TRABAJA_EN (

DNI integer not null,

Cod_Proy integer not null,

Horas integer default 10 not null check (Horas >= 10 and Horas <= 40),
primary key (DNI,Cod_Proy),

foreign key (DNI) references empleado,

foreign key (Cod_Proy) references proyecto(Codigo)

);

Nótese lo siguiente:
- Las palabras reservadas foreign key, solo aparecen en la definición a nivel de tabla,
no se ponen en la definición a nivel de columna, aunque el efecto en los dos casos es
el mismo.

- Tenemos también la opción de poner a continúan del nombre de la tabla


referenciada y entre paréntesis en nombre de la columna referenciada. En el último
ejemplo hemos usado esta opción en la definición de la clave externa sobre
Cod_Proy.

2) Comprobar la estructura de las tablas creadas usando el comando desc de sqlplus.

desc empleado;
desc proyecto;
desc trabaja;

3) Insertar los siguientes datos correspondientes a un empleado: Agustin Perez Marcos,


con DNI 1231234 y salario 21000. Realizar la inserción sin proporcionar valor para el
atributo FechaAlta. Comprobar que se ha insertado correctamente la tupla con el
valor adecuado en FechaAlta.

insert into EMPLEADO values (12341234,'AGUSTIN','PEREZ MARCOS',sysdate,21000);


select * from empleado where dni=1231234;

4) Insertar la siguiente información correspondiente a un proyecto: Código=21234,


Nombre=’PUENTE’. Comprobar la información insertada.

insert into PROYECTO values (21234,'PUENTE',);


select * from PROYECTO where código=21234;

5) Insertar una tupla en TRABAJA_EN Indicando que el empleado Agustin Perez Trabaja
15 horas semanales en el proyecto PUENTE.

insert into TRABAJA_EN values (1231234, 21234, 15);


6) Insertar una tupla en TRABAJA_EN indicando que el empleado con DNI 3214321
trabaja 10 horas en el proyecto PUENTE. ¿Qué ocurre?

insert into TRABAJA_EN values (3214321, 21234, 10);

Lo que ocurre es que se obtiene un error debido a que el DNI 3214321 no existe en la
tabla EMPELADO, por lo que esta inserción violará la restricción de que DNI es clave
externa sobre TRABAJA_EN

El mensaje obtenido será similar al siguiente:


ERROR at line 1:
ORA-02291: integrity constraint (OPS$i010101010.SYS_C0086669) violated - parent
key not found

En este mensaje se indica el nombre de la restricción


(OPS$i010101010.SYS_C0086669). Este es un nombre puesto por el sistema puesto
que no lo hemos proporcionado nosotros en la definición

¡¡IMPORTANTE!! Si no se obtiene un error, es que la definición de la tabla no es


correcta pues no se ha incluido una restricción de integridad necesaria.

7) Modificar la estructura de la tabla EMPLEADO para que contenga una nueva columna
que permita almacenar la titulación de cada empleado.

alter table EMPLEADO add titulación varchar(50);

8) Modificar la tabla empleado para eliminar la restricción que no permite que dos
empleados se llamen igual.

Nótese que hemos sido previsores y en la creación de la tabla dimos un nombre a esa
restricción por lo que ahora simplemente tenemos que indicar que se elimine esa
restricción.

Si no le hemos dado un nombre en la creación, tenemos que averiguar que nombre le


ha dado el sistema, para lo cual podemos consultar el catálogo o bien intentar violarla
para ver, en el mensaje de error que obtendremos, el nombre de la restricción, de
modo similar a lo visto en el EJERCICIO 6

alter table EMPLEADO drop constraint EMP_UNIQ;

9) Eliminar la tabla EMPLEADO. ¿Qué ocurre?


drop table EMPLEADO;

No se nos debe permitir hacerlo porque no se puede eliminar una tabla que es
referenciada por otro objeto, ya que esto violará la regla de integridad referencial.
En nuestro caso, EMPLEADO está referenciada por TRABAJA_EN.
Deberíamos obtener un mensaje de error como el siguiente:
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys

10) Eliminar todas las tablas creadas en el orden adecuado.


No podemos empezar borrando las tablas EMPLEADO ni PROYECTO, puesto que
TRABAJA_EN hace referencia a ellas.
Por tanto, se elimina primero la tabla TRABAJA_EN, ya que no hay ninguna otra que
haga referencia a ella.
A continuación, ya nadie hace referencia a EMPLEADO ni a PROYECTO, por lo que las
podemos eliminar en cualquier orden.

drop table TRABAJA_EN;


drop table EMPLEADO;
drop table PROYECTO;

También podría gustarte