40 - Restriccion check


Primer problema:

Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados".
1- Elimine la tabla:

  drop table empleados;

2- Créela con la siguiente estructura:

 create table empleados (
  documento char(8),
  nombre varchar2(30),
  cantidadhijos number(2),
  seccion varchar2(20),
  sueldo number(6,2) default -1
 );

3- Agregue una restricción "check" para asegurarse que no se ingresen valores negativos para el sueldo.

Note que el campo "sueldo" tiene establecido un valor por defecto (el valor -1) que va contra la restricción; Oracle no controla esto, permite establecer la restricción, pero al intentar ingresar un registro con el valor por defecto en tal campo, muestra un mensaje de error.

4- Intente ingresar un registro con la palabra clave "default" en el campo "sueldo" (mensaje de error)

5- Ingrese algunos registros válidos:

 insert into empleados values ('22222222','Alberto Lopez',1,'Sistemas',1000);
 insert into empleados values ('33333333','Beatriz Garcia',2,'Administracion',3000);
 insert into empleados values ('34444444','Carlos Caseres',0,'Contaduría',6000);

6- Intente agregar otra restricción "check" al campo sueldo para asegurar que ninguno supere el valor 5000.
La sentencia no se ejecuta porque hay un sueldo que no cumple la restricción.

7- Elimine el registro infractor y vuelva a crear la restricción

8- Establezca una restricción "check" para "seccion" que permita solamente los valores "Sistemas", "Administracion" y "Contaduría".

9- Ingrese un registro con valor "null" en el campo "seccion".

10- Establezca una restricción "check" para "cantidadhijos" que permita solamente valores entre 0 y 15.

11- Vea todas las restricciones de la tabla (4 filas)

12- Intente agregar un registro que vaya contra alguna de las restricciones al campo "sueldo".
Mensaje de error porque se infringe la restricción "CK_empleados_sueldo_positivo".

13- Intente modificar un registro colocando en "cantidadhijos" el valor "21".

14- Intente modificar el valor de algún registro en el campo "seccion" cambiándolo por uno que no esté incluido en la lista de permitidos.

15- Intente agregar una restricción al campo sección para aceptar solamente valores que comiencen con la letra "B".

Note que NO se puede establecer esta restricción porque va en contra de la establecida anteriormente para el mismo campo, si lo permitiera, no podríamos ingresar ningún valor para "seccion".

16- Agregue un registro con documento nulo.

17- Intente agregar una restricción "primary key" para el campo "documento".
No lo permite porque existe un registro con valor nulo en tal campo.

18- Elimine el registro que infringe la restricción y establezca la restricción del punto 17.

19- Consulte "user_constraints", mostrando los campos "constraint_name", "constraint_type" y "search_condition" de la tabla "empleados" (5 filas)

20- Consulte el catálogo "user_cons_colums" recuperando el nombre de las restricciones establecidas en el campo sueldo de la tabla "empleados" (2 filas)

Ver solución

  drop table empleados;

 create table empleados (
  documento char(8),
  nombre varchar2(30),
  cantidadhijos number(2),
  seccion varchar2(20),
  sueldo number(6,2) default -1
 );

 alter table empleados
 add constraint CK_empleados_sueldo_positivo
 check (sueldo>0);

 insert into empleados values ('33555888','Juan Pereyra',1,'Sistemas',default);

 insert into empleados values ('22222222','Alberto Lopez',1,'Sistemas',1000);
 insert into empleados values ('33333333','Beatriz Garcia',2,'Administracion',3000);
 insert into empleados values ('34444444','Carlos Caseres',0,'Contaduría',6000);

 alter table empleados
 add constraint CK_empleados_sueldo_maximo
 check (sueldo<=5000);

 delete from empleados where sueldo=6000;

 alter table empleados
 add constraint CK_empleados_sueldo_maximo
 check (sueldo<=5000); 

 alter table empleados
 add constraint CK_empleados_seccion_lista
 check (seccion in ('Sistemas','Administracion','Contaduria'));

 insert into empleados
  values ('31111222','Roberto Sanchez',1,null,1500);

 alter table empleados
 add constraint CK_cantidadhijos
 check (cantidadhijos between 0 and 15);

 select *from user_constraints where table_name='EMPLEADOS';

 insert into empleados
  values ('24444444','Carlos Fuentes',2,'Administracion',-1500);

 update empleados set cantidadhijos=21 where documento='22222222';

 update empleados set seccion='Recursos' where documento='22222222';

 alter table empleados
 add constraint CK_seccion_letrainicial
 check (seccion like '%B');

 insert into empleados values(null,'Federico Torres',1,'Sistemas',1800);

 alter table empleados
 add constraint PK_empleados_documento
 primary key (documento);

 delete from empleados where nombre='Federico Torres';
 alter table empleados
 add constraint PK_empleados_documento
 primary key (documento);

 select constraint_name, constraint_type, search_condition
  from user_constraints
  where table_name='EMPLEADOS';

 select constraint_name
  from user_cons_columns
  where table_name='EMPLEADOS' and
  column_name='SUELDO';

 

Segundo problema:

Una playa de estacionamiento almacena los datos de los vehículos que ingresan en la tabla llamada "vehiculos".

1- Setee el formato de "date" para que nos muestre día, mes, año, hora y minutos:

 alter session set NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI';

2- Elimine la tabla "vehiculos" y créela con la siguiente estructura:

 drop table vehiculos;

 create table vehiculos(
  numero number(5),
  patente char(6),
  tipo char(4),
  fechahoraentrada date,
  fechahorasalida date
 );

3- Ingrese algunos registros:

 insert into vehiculos values(1,'AIC124','auto','17/01/2017 8:05','17/01/2017 12:30');
 insert into vehiculos values(2,'CAA258','auto','17/01/2017 8:10',null);
 insert into vehiculos values(3,'DSE367','moto','17/01/2017 8:30','17/01/2017 18:00');

4- Agregue una restricción de control que especifique que el campo "tipo" acepte solamente los valores "auto" y "moto":

 alter table vehiculos
 add constraint CK_vehiculos_tipo_valores
 check (tipo in ('auto','moto'));

5- Intente modificar el valor del campo "tipo" ingresando un valor inexistente en la lista de valores permitidos por la restricción establecida a dicho campo.

6- Ingrese un registro con valor nulo para "tipo".

7- Agregue una restricción de control al campo "fechahoraentrada" que establezca que sus valores no sean posteriores a "fechahorasalida".

8- Intente modificar un registro para que la salida sea anterior a la entrada.

9- Vea todas las restricciones para la tabla "vehiculos".

10- Ingrese un registro con valor nulo para "fechahoraentrada".

11- Vea todos los registros.

12- Consulte "user_cons_columns" y analice la información retornada.


Ver solución
 alter session set NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI';

 drop table vehiculos;

 create table vehiculos(
  numero number(5),
  patente char(6),
  tipo char(4),
  fechahoraentrada date,
  fechahorasalida date
 );

 insert into vehiculos values(1,'AIC124','auto','17/01/2017 8:05','17/01/2017 12:30');
 insert into vehiculos values(2,'CAA258','auto','17/01/2017 8:10',null);
 insert into vehiculos values(3,'DSE367','moto','17/01/2017 8:30','17/01/2017 18:00');

 alter table vehiculos
 add constraint CK_vehiculos_tipo_valores
 check (tipo in ('auto','moto'));

 update vehiculos set tipo='bici' where patente='AIC124';

  insert into vehiculos values(4,'SDF134',null,null,null);

 alter table vehiculos
  add constraint CK_vehiculos_entradasalida
  check (fechahoraentrada<=fechahorasalida);

 update vehiculos set fechahorasalida='17/01/2017 7:30'
  where patente='CAA258';

 select *from user_constraints where table_name='VEHICULOS';

 insert into vehiculos values(8,'DFR156','moto',null,default);

 select *from vehiculos;

 select *from user_cons_columns where table_name='VEHICULOS';

Retornar