miércoles, 13 de julio de 2011

Propiedades de tabla

Valores predeterminados
 
Hemos visto que si al insertar registros no se especifica un valor para un campo que admite valores nulos, se ingresa automáticamente "null". A este valor se le denomina valor por defecto o predeterminado.
Un valor por defecto se inserta cuando no está presente al ingresar un registro.
Para campos de cualquier tipo no declarados "not null", es decir, que admiten valores nulos, el valor por defecto es "null". Para campos declarados "not null", no existe valor por defecto, a menos que se declare explícitamente con la cláusula "default".
Podemos establecer valores por defecto para los campos cuando creamos la tabla. Para ello utilizamos "default" al definir el campo. Por ejemplo, queremos que el valor por defecto del campo "autor" de la tabla "libros" sea "Desconocido" y el valor por defecto del campo "cantidad" sea "0":
create table libros(
  titulo varchar2(40) not null,
  autor varchar2(30) default 'Desconocido' not null, 
  editorial varchar2(20),
  precio number(5,2),
  cantidad number(3) default 0
 );
Si al ingresar un nuevo registro omitimos los valores para el campo "autor" y "cantidad", Oracle insertará los valores por defecto; en "autor" colocará "Desconocido" y en cantidad "0".
Entonces, si al definir el campo explicitamos un valor mediante la cláusula "default", ése será el valor por defecto.
La cláusula "default" debe ir antes de "not null" (si existiese), sino aparece un mensaje de error.
Para ver si los campos de la tabla "libros" tiene definidos valores por defecto y cuáles son, podemos realizar la siguiente consulta:
select column_name,nullable,data_default
  from user_tab_columns where TABLE_NAME = 'libros';
Muestra una fila por cada campo, en la columna "data_default" aparece el valor por defecto (si lo tiene), en la columna "nullable" aparece "N" si el campo no está definido "not null" y "Y" si admite valores "null".
También se puede utilizar "default" para dar el valor por defecto a los campos en sentencias "insert", por ejemplo:
insert into libros (titulo,autor,editorial,precio,cantidad)
  values ('El gato con botas',default,default,default,100);
Entonces, la cláusula "default" permite especificar el valor por defecto de un campo. Si no se explicita, el valor por defecto es "null", siempre que el campo no haya sido declarado "not null".
Los campos para los cuales no se ingresan valores en un "insert" tomarán los valores por defecto:
  • si permite valores nulos y no tiene cláusula "default", almacenará "null";
  • si tiene cláusula "default" (admita o no valores nulos), el valor definido como predeterminado;
  • si está declarado explícitamente "not null" y no tiene valor "default", no hay valor por defecto, así que causará un error y el "insert" no se ejecutará.
Un campo sólo puede tener un valor por defecto. Una tabla puede tener todos sus campos con valores por defecto. Que un campo tenga valor por defecto no significa que no admita valores nulos, puede o no admitirlos.
Un campo definido como clave primaria acepta un valor "default", pero no tiene sentido ya que el valor por defecto solamente podrá ingresarse una vez; si intenta ingresarse cuando otro registro ya lo tiene almacenado, aparecerá un mensaje de error indicando que se intenta duplicar la clave.

Restriccion check


La restricción "check" especifica los valores que acepta un campo, evitando que se ingresen valores inapropiados.
La sintaxis básica es la siguiente:
 alter table NOMBRETABLA
 add constraint NOMBRECONSTRAINT
 check CONDICION;
Trabajamos con la tabla "libros" de una librería 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 number(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 restricción "check":
alter table libros
 add constraint CK_libros_precio_positivo
 check (preciomin>=0 and preciomay>=0);
Este tipo de restricción verifica los datos cada vez que se ejecuta una sentencia "insert" o "update", es decir, actúa en inserciones y actualizaciones.
Si la tabla contiene registros que no cumplen con la restricción que se va a establecer, la restricción no se puede establecer, hasta que todos los registros cumplan con dicha restricción.
La condición 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 convención, 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 fácilmente de qué se trata la restricción, por si tenemos varias restricciones "check" para el mismo campo.
Un campo puede tener varias restricciones "check" y una restricción "check" puede incluir varios campos.
Las condiciones para restricciones "check" también pueden incluir una lista de valores. Por ejemplo establecer que cierto campo asuma sólo los valores que se listan:
...
 check (CAMPO in ('lunes','miercoles','viernes'));
Si un campo permite valores nulos, "null" es un valor aceptado aunque no esté incluido en la condición de restricción.
Si intentamos establecer una restricción "check" para un campo que entra en conflicto con otra restricción "check" establecida al mismo campo, Oracle no lo permite. Pero si establecemos una restricción "check" para un campo que entra en conflicto con un valor "default" establecido para el mismo campo, Oracle lo permite; pero al intentar ingresar un registro, aparece un mensaje de error.
En las condiciones de chequeo no es posible incluir funciones (como "sysdate").
Un campo con una restricción "primary key" o "unique" puede tener una (o varias) restricciones "check".
En la condición de una restricción "check" se puede establecer que un campo no admita valores nulos:
 alter table libros
 add constraint CK_libros_titulo
 check (titulo is not null);
 

Restricción unique

Anteriormente aprendimos la restricción "primary key", otra restricción que asegura valores únicos para cada registro es "unique".
La restricción "unique" impide la duplicación 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 número de legajo) pero se necesita asegurar que otros datos también sean únicos y no se repitan (como número 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 restricción "unique" sobre el campo "documento" de la tabla "alumnos", esto asegura que no se pueda ingresar un documento si ya existe. Esta restricción permite valores nulos, asi que si se ingresa el valor "null" para el campo "documento", se acepta.
Por convención, 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 restricción a una tabla que contiene información, Oracle controla los datos existentes para confirmar que cumplen la condición de la restricción, si no los cumple, la restricción no se aplica y aparece un mensaje de error. En el caso del ejemplo anterior, si la tabla contiene números de documento duplicados, la restricción no podrá establecerse; si podrá establecerse si tiene valores nulos.
Oracle controla la entrada de datos en inserciones y actualizaciones evitando que se ingresen valores duplicados.
Un campo que se estableció como clave primaria no puede definirse como clave única; si una tabla tiene una clave primaria, puede tener una o varias claves únicas (aplicadas a otros campos que no sean clave primaria).
Si consultamos el catálogo "user_constraints", podemos ver las restricciones "unique" (y todos los tipos de restricciones) de todas las tablas del usuario actual. El resultado es una tabla que nos informa el propietario de la restricción (OWNER), el nombre de la restricción (CONSTRAINT_NAME), el tipo (CONSTRAINT_TYPE, si es "unique" muestra una "U"), el nombre de la tabla en la cual se aplica (TABLE_NAME), y otra información que no analizaremos por el momento.
También podemos consultar el catálogo "user_cons_columns"; nos mostrará el propietario de la restricción (OWNER), el nombre de la restricción (CONSTRAINT_NAME), la tabla a la cual se aplica (TABLE_NAME), el campo (COLUMN_NAME) y la posición (POSITION).

 

No hay comentarios:

Publicar un comentario