You are on page 1of 10

Actividad 10

15-marzo-2017

Restriccin "check
La restriccin "check" especifica los valores que acepta un campo, evitando que se ingresen
valores inapropiados.

La sintaxis bsica es la siguiente:

alter table NOMBRETABLA


add constraint NOMBRECONSTRAINT
check CONDICION;

Trabajamos con la tabla "libros" de una librera que tiene los siguientes campos: codigo, titulo,
autor, editorial, preciomin (que indica el precio para los minoristas) y preciomay (que indica el
precio para los mayoristas).

Los campos correspondientes a los precios (minorista y mayorista) se definen de tipo decimal(5,2),
es decir, aceptan valores entre -999.99 y 999.99. Podemos controlar que no se ingresen valores
negativos para dichos campos agregando una restriccin "check":

alter table libros


add constraint CK_libros_precio_positivo
check (preciomin>=0 and preciomay>=0);

Este tipo de restriccin verifica los datos cada vez que se ejecuta una sentencia "insert" o "update",
es decir, acta en inserciones y actualizaciones.

Si la tabla contiene registros que no cumplen con la restriccin que se va a establecer, la restriccin
no se puede establecer, hasta que todos los registros cumplan con dicha restriccin.

La condicin puede hacer referencia a otros campos de la misma tabla. Por ejemplo, podemos
controlar que el precio mayorista no sea mayor al precio minorista:

alter table libros


add constraint CK_libros_preciominmay
check (preciomay<=preciomin);

Por convencin, cuando demos el nombre a las restricciones "check" seguiremos la misma
estructura: comenzamos con "CK", seguido del nombre de la tabla, del campo y alguna palabra con
la cual podamos identificar fcilmente de qu se trata la restriccin, por si tenemos varias
restricciones "check" para el mismo campo.

Un campo puede tener varias restricciones "check" y una restriccin "check" puede incluir varios
campos.

Si un campo permite valores nulos, "null" es un valor aceptado aunque no est incluido en la
condicin de restriccin.
PROBLEMA

Una playa de estacionamiento almacena los datos de los vehculos que ingresan en la
tabla llamada "vehiculos":( numero serial, patente char(6), tipo char(4),
fechahoraentrada timestamp, fechahorasalida timestamp, primary key(numero) )

Ingrese los siguientes registros:


('AIC124','auto','2007/01/17 8:05','2007/01/17 12:30');
('CAA258','auto','2007/01/17 8:10',null);
('DSE367','moto','2007/01/17 8:30','2007/01/17 18:00');

1- Agregue una restriccin "check" para asegurarse que la fecha de entrada a la playa
no sea posterior a la fecha y hora actual

2- Agregue otra restriccin "check" al campo "fechahoraentrada" que establezca que


sus valores no sean posteriores a "fechahorasalida"
3- Intente ingresar un valor que no cumpla con la primera restriccin establecida en el
campo "fechahoraentrada"

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


5- Vea todas las restricciones para la tabla "vehiculos":
6- Vea todos los registros

Restriccin unique

Las restricciones aplicadas a tablas aseguran valores nicos para cada registro.
Anteriormente se reviso la restriccin "primary key", otra restriccin para las tablas es "unique".
La restriccin "unique" impide la duplicacin de claves alternas (no primarias), es decir, especifica
que dos registros no puedan tener el mismo valor en un campo. Se permiten valores nulos. Se
pueden aplicar varias restricciones de este tipo a una misma tabla, y pueden aplicarse a uno o
varios campos que no sean clave primaria.

Se emplea cuando ya se estableci una clave primaria (como un nmero de legajo) pero se
necesita asegurar que otros datos tambin sean nicos y no se repitan (como nmero de
documento).

La sintaxis general es la siguiente:

alter table NOMBRETABLA


add constraint NOMBRERESTRICCION
unique (CAMPO);
Ejemplo:

alter table alumnos


add constraint UQ_alumnos_documento
unique (documento);
En el ejemplo anterior se agrega una restriccin "unique" sobre el campo "documento" de la tabla
"alumnos", esto asegura que no se pueda ingresar un documento si ya existe. Esta restriccin
permite valores nulos, asi que si se ingresa el valor "null" para el campo "documento", se acepta.

Por convencin, cuando demos el nombre a las restricciones "unique" seguiremos la misma
estructura: "UQ_NOMBRETABLA_NOMBRECAMPO". Quiz parezca innecesario colocar el
nombre de la tabla, pero cuando empleemos varias tablas ver que es til identificar las
restricciones por tipo, tabla y campo.

Recuerde que cuando agregamos una restriccin a una tabla que contiene informacin,
PostgreSQL controla los datos existentes para confirmar que cumplen la condicin de la restriccin,
si no los cumple, la restriccin no se aplica y aparece un mensaje de error. En el caso del ejemplo
anterior, si la tabla contiene nmeros de documento duplicados, la restriccin no podr
establecerse; si podr establecerse si tiene valores nulos.

PostgreSQL controla la entrada de datos en inserciones y actualizaciones evitando que se ingresen


valores duplicados.

PROBLEMA

Trabajamos con la tabla "alumnos": (legajo char(4) not null, apellido varchar(20),
nombre varchar(20), documento char(8) )
1- Agregamos una restriccin "primary" para el campo "legajo":

2- Agregamos una restriccin "unique" para el campo "documento":


3- Ingrese los siguientes registros:
('A111','Lopez','Ana','22222222');
('A123','Garcia','Maria','23333333');

4- -Intente ingresar un legajo o documento repetido, indique que aparece


Eliminar restricciones (alter table - drop constraint)
Para eliminar una restriccin, la sintaxis bsica es la siguiente:

alter table NOMBRETABLA


drop constraint NOMBRERESTRICCION;
Para eliminar la restriccin "CK_libros_precio_positivo" de la tabla libros tipeamos:

alter table libros


drop constraint CK_libros_precio_positivo;
Cuando eliminamos una tabla, todas las restricciones que fueron establecidas en ella, se eliminan
tambin.

EJEMPLO:

Tabla "libros" de una librera clave primaria:( codigo int not null, titulo varchar(40), autor varchar(30),
editorial varchar(15), precio decimal(6,2) )

Definimos una restriccin "primary key" para nuestra tabla "libros" para asegurarnos que cada libro
tendr un cdigo diferente y nico:

alter table libros


add constraint PK_libros_codigo
primary key(codigo);
Definimos una restriccin "check" para asegurarnos que el precio no ser negativo:

alter table libros


add constraint CK_libros_precio
check (precio>=0);
Vemos las restricciones:

select *
from information_schema.table_constraints
where table_name = 'libros';
Aparecen 2 restricciones, 1 "check" y 1 "primary key".

Eliminamos la restriccin "PK_libros_codigo":

alter table libros


drop constraint PK_libros_codigo;
Vemos si se eliminaron:

select *
from information_schema.table_constraints
where table_name = 'libros';

You might also like