Las restricciones son usadas por IBM® DB2® para Linux®, UNIX® y Windows® (DB2) con el fin de hacer cumplir reglas de negocios para los datos y de ayudar a conservar la integridad de la base de datos. Este artículo describe los diversos tipos de restricciones soportadas por DB2 y ofrece ejemplos de cada uno de estos tipos de restricciones. Además, el autor explica los fundamentos de la gestión de restricciones (usando tanto la línea de comandos como DB2 Control Center).[Este artículo se encuentra actualizado para que refleje DB2 9.7 y otras actualizaciones.--Ed.]

Introducción

Esta sección describe las diferencias en la estructura de los procedimientos en SQL de DB2 y solidDB.

Las restricciones son usadas por DB2 para Linux, UNIX y Windows (DB2 LUW) con el fin de hacer cumplir reglas para los datos. Este artículo describe los siguientes tipos de restricciones:

  • NOT NULL (NO NULA)
  • Unique (de clave única)
  • Primary key (Clave primaria)
  • Foreign key (Clave externa)
  • Table check (Control de tablas)

Existe otro tipo de restricción conocida como restricción de información. A diferencia de los cinco tipos de restricciones que se enumeran anteriormente, la restricción de información no la impone el administrador de la base de datos, sino que puede ser usada por el compilador de SQL para mejorar el rendimiento de las consultas. Este artículo se centra solamente en los tipos de restricciones de la lista.

Se pueden definir una o más restricciones a DB2 cuando se crea una tabla nueva, o se pueden definir algunas de ellas alterando la tabla en un momento posterior. La instrucción CREATE TABLE (CREAR TABLA) es una instrucción muy compleja. De hecho, es tan complejo que si bien se usa apenas una pequeña fracción de sus opciones para las definiciones de las restricciones, estas opciones pueden ser bastante complejas cuando aparecen en un diagrama de sintaxis, como se muestra en la Figura 1.

Figura 1. Sintaxis parcial de la instrucción CREATE TABLE, donde se muestran las cláusulas que se usan para definir las restricciones
Sintaxis parcial de la instrucción CREATE TABLE, donde se muestran las cláusulas que se usan para definir las restriccionesSintaxis parcial de la instrucción CREATE TABLE, donde se muestran las cláusulas que se usan para definir las restriccionesSintaxis parcial de la instrucción CREATE TABLE, donde se muestran las cláusulas que se usan para definir las restricciones

La gestión de restricciones puede resultar más simple y más conveniente cuando se realiza por medio del DB2 Control Center.

Las definiciones de las restricciones se asocian con la base de datos a la cual corresponden, y se almacenan en el catálogo de la base de datos, como se muestra en la Tabla 1. Usted puede consultar el catálogo de la base de datos para recuperar e inspeccionar esta información. Puede hacerlo directamente desde la línea de comandos (recuerde establecer primero una conexión con la base de datos), o, nuevamente, quizás le resulte más conveniente acceder a parte de esta información mediante el DB2 Control Center.

Las restricciones que usted cree son manejadas como cualquier otro objeto de la base de datos. Tienen un nombre, un esquema asociado (ID del creador), y en algunos casos, pueden abandonarse (eliminarse).

Figura 2. Sintaxis parcial de la instrucción CREATE TABLE, donde se muestran las cláusulas que se usan para definir las restricciones (continuación)
Sintaxis parcial de la instrucción CREATE TABLE, donde se muestran las cláusulas que se usan para definir las restricciones (continuación)

La Tabla 1 muestra información sobre las restricciones en el catálogo de la base de datos. Para que se ejecuten con éxito, las consultas al catálogo requieren una conexión con la base de datos.

Tabla 1. Información de las restricciones en el catálogo de la base de datos
Vista del catálogoVer columnaDescripciónEjemplo de consulta
SYSCAT.CHECKSContiene una fila para cada restricción de verificación de tabladb2 select constname, tabname, text from syscat.checks
SYSCAT.COLCHECKSContiene una fila para cada columna a la que hace referencia una restricción de verificación de tabladb2 select constname, tabname, colname, usage from syscat.colchecks
SYSCAT.COLUMNSNULLSIndica si una columna es anulable (Y) o no (N)db2 select tabname, colname, nulls from syscat.columns where tabschema = 'DELSVT' and nulls = 'N'
SYSCAT.CONSTDEPIncluye una fila para cada dependencia de una restricción u otro objetodb2 select constname, tabname, btype, bname from syscat.constdep
SYSCAT.INDEXESIncluye una fila para cada índice.db2 select tabname, uniquerule, made_unique, system_required from syscat.indexes where tabschema = 'DELSVT'
SYSCAT.KEYCOLUSEIncluye una fila para cada columna que participa en una clave definida por una restricción de clave única primaria, o claves externasdb2 select constname, tabname, colname, colseq from syscat.keycoluse
SYSCAT.REFERENCESIncluye una fila para cada restricción de referenciadb2 select constname, tabname, refkeyname, reftabname, colcount, deleterule, updaterule from syscat.references
SYSCAT.TABCONSTIncluye una fila por cada restricción de clave única (U), clave primaria (P), clave externa (F), o verificación de tabla (K)db2 select constname, tabname, type from syscat.tabconst
SYSCAT.TABLESPARENTSCantidad de tablas principales (parent) de esta tabla (cantidad de restricciones de referencia de las cuales depende esta tabla)db2 "select tabname, parents from syscat.tables where parents > 0"
SYSCAT.TABLESCHILDRENCantidad de tablas secundarias (children) de esta tabla (cantidad de restricciones de referencia para las cuales esta tabla es una tabla principal)db2 "select tabname, children from syscat.tables where children > 0"
SYSCAT.TABLESSELFREFSCantidad de restricciones autorreferenciales para la tabla (cantidad de restricciones de referencia en las cuales la tabla es principal y secundaria)db2 "select tabname, selfrefs from syscat.tables where selfrefs > 0"
SYSCAT.TABLESKEYUNIQUECantidad de restricciones de únicas (que no sean de clave primaria) definidas en la tabladb2 "select tabname, keyunique from syscat.tables where keyunique > 0"
SYSCAT.TABLESCHECKCOUNTCantidad de restricciones de verificación definidas en la tabladb2 "select tabname, checkcount from syscat.tables where checkcount > 0"

"No puede no ser nada": La restricción NOT NULL

La restricción NOT NULL evita que se agreguen valores nulos a una columna. Así se asegura que la columna tenga un valor con sentido para cada fila de la tabla. Por ejemplo, la definición de la tabla EMPLOYEE (EMPLEADOS) de la base de datos SAMPLE (MUESTRA) incluye LASTNAME VARCHAR(15) NOT NULL, lo cual asegura que cada fila contenga el apellido de un empleado.

A fin de determinar si una columna es anulable, usted podrá consultar el lenguaje de definición de datos (DDL) para la tabla (el cual usted podrá generar si invoca la utilidad db2look). Puede usar el DB2 Control Center, como se muestra en la Figura 3 y en la Figura 4.

Figura 3. Vista de las tablas en el Control Center
Vista de las tablas en el Control Center

El DB2 Control Center le permite acceder convenientemente a los objetos de la base de datos como por ejemplo las tablas. La Figura 3 muestra las tablas de usuarios en la base de datos SAMPLE. Aparecen en el recuadro de contenidos cuando se selecciona Tables (Tablas) en el árbol de objetos. Si usted selecciona la tabla STAFF (PERSONAL), podrá abrir la ventana Alter Table (Alterar tabla) para ver la definición de la tabla, incluyendo los atributos de columna que se muestran en la Figura 4.

Figura 4. Pantalla Alter Table del Control Center
Pantalla Alter Table del Control Center

Opcionalmente, puede consultar el catálogo de la base de datos, como se muestra en el Listado 1.

Listado 1. Consultas al catálogo de la base de datos para determinar cuáles son las columnas anulables
db2 select tabname, colname, nulls from syscat.columns where
                tabschema = 'DELSVT' and nulls = 'N'

"Sólo para claves únicas ": la restricción de las claves únicas

La restricción de claves únicas evita que un valor aparezca más de una vez dentro de una columna particular en la tabla. Además, evita que aparezca un conjunto de valores más de una vez dentro de un conjunto determinado de columnas. Las columnas a las que se hace referencia en una restricción de claves únicas se deben definir como NOT NULL. La restricción de claves únicas se puede definir en la instrucción CREATE TABLE usando la cláusula UNIQUE (Figura 1 y Figura 2), o en una instrucción ALTER TABLE, como se muestra en el Listado 2.

El Listado 2 muestra cómo crear una restricción de claves únicas. La tabla ORG_TEMP es idéntica a la tabla ORG de la base de datos SAMPLE, a excepción de que la columna LOCATION de ORG_TEMP no es anulable, y la columna LOCATION puede tener una restricción de única definida en ella.

Listado 2. Cómo crear una restricción de única
db2 create table org_temp ( deptnumb smallint not null, deptname
varchar(14), manager smallint, division varchar(10), location varchar(13) not
    null ) db2 alter table org_temp add unique(location) db2 insert into
org_temp values (10, 'Head Office', 160, 'Corporate', 'New York') DB20000I
The SQL command completed successfully. db2 insert into org_temp values (15, 'New
England', 50, 'Eastern', 'New York') DB21034E The command was processed as an
SQL statement because it was not a valid Command Line Processor command. During SQL
processing it returned: SQL0803N One or more values in the INSERT statement, UPDATE
statement, or foreign key update caused by a DELETE statement are not valid because
the primary key, unique constraint or unique index identified by "1" constrains
table "DELSVT.ORG_TEMP" from having duplicate values for the index key.
SQLSTATE=23505

Nombres de las restricciones

Si usted no especifica un nombre para una restricción al crearla, DB2 asigna un nombre basado en la marca de tiempo de creación, por ejemplo SQL100419222516560.

La restricción de única ayuda a asegurar la integridad de los datos evitando la duplicación no intencional. En el ejemplo, la restricción de única evita la inserción de un segundo registro que especifique New York como ubicación de una sucursal de la organización. La restricción de única se pone en funcionamiento a través de un índice de claves únicas.


"Somos los número uno": restricción de clave primaria

Larestricción de clave primariaasegura que todos los valores de la columna o el conjunto de columnas que forman la clave primaria de una tabla sean únicos. La clave primaria se usa para identificar las filas específicas de la tabla. Una tabla no puede tener más de una clave primaria, pero puede contar con varias claves únicas. La restricción de clave primaria es un caso especial de restricción de clave única, que se pone en funcionamiento a través de un índice primario.

Las columnas a las que se hace referencia en una restricción de clave primaria se deben definir como NOT NULL. La restricción de clave primaria puede definirse en la instrucción CREATE TABLE usando la cláusula PRIMARY KEY (ver Figura 1 y Figura 2), o en una instrucción ALTER TABLE como se muestra en el Listado 3.

El Listado 3 muestra cómo se crea una restricción de clave primaria. La columna ID de la tabla STAFF no es anulable, y puede contener una restricción de clave primaria definida en ella.

Listado 3. Cómo crear una restricción de clave primaria
db2 alter table staff add primary key (id)

Opcionalmente, usted puede usar el DB2 Control Center para definir una restricción de clave primaria en una tabla, como se muestra en la Figura 5 y en la Figura 6. La ventana Alter Table ofrece una manera conveniente de definir una restricción de clave primaria en una tabla. Seleccione la pestaña Keys (Claves), y luego haga clic en Add Primary (Agregar primaria).

Figura 5. Ventana Alter Table
Ventana Alter Table

Aparece la ventana Define Primary Key (Definir clave primaria), como se muestra en la Figura 6.

Figura 6. Ventana Define Primary Key
Ventana Define Primary Key

La ventana Define Primary Key le permite seleccionar una o más columnas en la lista de columnas Available (Disponibles). Oprima el botón > para pasar los nombres de la lista de la columna Available a la columna Selected (Seleccionadas). Observe que las columnas seleccionadas no deberán ser anulables.


"Todo es relativo": restricción de clave externa

La restricción de clave externa es a veces conocida como restricción referencial.La integridad referencial se define como el estado de una base de datos en la cual todos los valores de claves externas son válidos. Entonces, ¿qué es una clave externa? Una clave externa es una columna o un conjunto de columnas en una tabla cuyos valores deben corresponder por lo menos a un valor de clave primaria o de clave única de una fila en su tabla principal. ¿Qué significa esto exactamente? En realidad, no es tan malo como suena. Simplemente significa que si una columna (C2) de una tabla (T2) posee valores que corresponden a los valores de una columna (C1) de otra tabla (T1), y C1 es la columna de la calve primaria de T1, entonces C2 es una columna de clave externa en T2. La tabla que incluye la clave principal (clave primaria o clave única) se denomina tabla principal, y la tabla que contiene la clave externa se denomina tabla dependiente. Tome en cuenta el ejemplo siguiente.

La tabla PROJECT (PROYECTO) de la base de datos SAMPLE tiene una columna denominada RESPEMP. Los valores de esta columna representan la cantidad de empleados que son responsables por cada uno de los proyectos mencionados en la tabla. RESPEMP no es anulable. Debido a que esta columna corresponde a la columna EMPNO de la tabla EMPLOYEE, y a que EMPNO es ahora la clave primaria de la tabla EMPLOYEE, RESPEMP se puede definir como una clave externa en la tabla PROJECT, como se muestra en el Listado 4. Esto asegura que las futuras eliminaciones que se realicen en la tabla EMPLOYEE no dejarán a la tabla PROJECT con empleados responsables inexistentes.

Una restricción de clave externa puede definirse en la instrucción CREATE TABLE usando la cláusula FOREIGN KEY (ver Figura 1 y Figura 2), o en una instrucción ALTER TABLE, como se muestra en el Listado 4.

Listado 4. Cómo crear una restricción de clave externa
db2 alter table projectadd foreign
                    key(respemp)referencesemployee on delete cascade

La cláusula REFERENCES señala la tabla principal para esta restricción referencial. La sintaxis usada para definir una restricción de clave externa incluye una rule-clause (cláusula de reglas), que es donde usted puede indicarle a DB2 de qué manera desea actualizar o eliminar las operaciones manejadas desde una perspectiva de integridad referencial (ver Figura 1).

Las operaciones de inserción se manejan de manera estándar y usted no tiene control sobre las mismas. La insert rule (regla de inserción) de una restricción referencial es que un valor de inserción de la clave externa debe corresponderse con algún valor de la clave principal en la tabla principal. Esto es consistente con lo que ya se ha dicho. Si se va a insertar un nuevo registro en la tabla PROJECT, dicho registro deberá contener una referencia (a través de la relación clave principal – externa) a un registro existente en la tabla EMPLOYEE.

Laupdate rule (regla de actualización)de una restricción referencial es que un valor de actualización de la clave externa debe corresponder a algún valor de la clave principal de la tabla principal, y que todos los valores de clave externa deben tener valores correspondientes de claves principales cuando se completa una operación de actualización en la clave primaria. Nuevamente, todo esto significa que no puede haber huérfanos, y que cada clave dependiente debe tener una principal.

La delete rule (regla de eliminación) de una restricción referencial se aplica cuando se elimina una fila de una tabla principal, según la opción especificada cuando se definiera la restricción referencial.

Tabla 2. Opciones de restricción referencial
Si esta cláusula fue especificada cuando se creó la restricción referencial…Entonces éste es el resultado
RESTRICT o NO ACTIONNo se eliminan filas
SET NULLCada columna anulable de la clave externa se fija en nula
CASCADELa operación de eliminación pasa a las tablas dependientes de la tabla principal, que se consideran conectadas por eliminacióncon la tabla principal.

El Listado 5 muestra algunos de estos puntos.

Listado 5. Demostración de la regla de actualización y de eliminación en una restricción de clave externa
db2 update employee set empno = '350' where empno = '000200'
DB20000I The SQL command completed successfully. db2 update employee set empno =
'360' where empno = '000220' DB21034E The command was processed as an SQL statement
because it was not a valid Command Line Processor command. During SQL processing it
returned: SQL0531N The parent key in a parent row of relationship
"DELSVT.PROJECT.FK_PROJECT_2" cannot be updated. SQLSTATE=23504 db2 "select respemp
from project where respemp < '000050' order by respemp" RESPEMP -------
000010 000010 000020 000030 000030 5 record(s) selected. db2 delete from employee
where empno = '000010' DB21034E The command was processed as an SQL statement
because it was not a valid Command Line Processor command. During SQL processing it
returned: SQL0532N A parent row cannot be deleted because the relationship
"DELSVT.PROJECT.FK_PROJECT_2" restricts the deletion. SQLSTATE=23001 db2 "select
empno from employee where empno < '000050' order by empno" EMPNO ------
000010 000020 000030 3 record(s) selected.

El valor EMPNO de 000200 en la tabla principal (EMPLOYEE) puede ser modificado, debido a que no existe un valor RESPEMP de000200 en la tabla dependiente (PROJECT). Sin embargo, para el valor EMPNO de 000220, existen valores de clave externa correspondientes en la tabla PROJECT y, por lo tanto, no se puede actualizar. La regla de eliminación que especifica la opción RESTRICT asegura que se no se puedan eliminar las filas que contienen el valor de clave principal de 000010 de la tabla EMPLOYEE cuando la tabla PROJECT conectada por eliminación contiene un valor de clave externa correspondiente.


"Controle y vuelva a controlar": restricción de control de tabla

Una restricción de control de tabla aplica restricciones definidas a datos que se agregan a una tabla. Por ejemplo, una restricción de control de tabla puede garantizar que la extensión telefónica de un empleado tenga exactamente cuatro dígitos cada vez que se agreguen o actualicen extensiones telefónicas en la tabla EMPLOYEE. Las restricciones de control de tabla se pueden definir en la instrucción CREATE TABLE usando la cláusula CHECK (ver Figura 1 y Figura 2), o en una instrucción ALTER TABLE, como se muestra en el Listado 6.

Listado 6. Cómo crear una restricción de control de tabla
db2 alter table employee add constraint phoneno_length
                check(length(rtrim(phoneno)) = 4)

La restricción PHONENO_LENGTH asegura que las extensiones telefónicas agregadas a la tabla EMPLOYEE tengan exactamente cuatro dígitos de extensión.

Opcionalmente, usted podrá usar el DB2 Control Center para definir una restricción de control de tabla, como se muestra en la Figura 7.

Figura 7. La ventana Alter Table brinda una manera conveniente de definir una restricción de control de tabla en una columna.
La ventana Alter Table brinda una manera conveniente de definir una restricción de control de tabla en una columna.

Presione el botón Add para definir una nueva restricción, y así se abrirá la ventana Add Check Constraint (Agregar restricción de control). O haga clic en el botón Change para modificar una restricción existente que usted haya seleccionado en la lista, como se muestra en la Figura 8.

Figura 8. La ventana Change Check Constraint le permite modificar una condición de control existente
La ventana Change Check Constraint le permite modificar una condición de control existente

Usted no puede crear una restricción de control de tabla si las filas existentes en la tabla contienen valores que violan la nueva restricción, como se muestra en la Figura 9. Podrá agregar o modificar la restricción con éxito después de que se hayan actualizado adecuadamente los valores incompatibles.

Figura 9. El sistema devuelve un error si la nueva restricción de control de tabla es incompatible con los valores existentes en la tabla
El sistema devuelve un error si la nueva restricción de control de tabla es incompatible con los valores existentes en la tabla

Cómo diferir los controles de datos

Se puede usar la instrucción SET INTEGRITY (CONFIGURAR INTEGRIDAD) para colocar una tabla en el estado pendiente de control. Esto permite la ejecución de la instrucción ALTER TABLE que define una nueva restricción de control para seguir sin controlar los datos existentes en la tabla.

Las restricciones de control de tabla pueden activarse o desactivarse usando la instrucción SET INTEGRITY. Esto puede resultar útil, por ejemplo, cuando se optimiza el rendimiento durante grandes operaciones de carga de datos en una tabla. El Listado 7 muestra cómo codificar un escenario simple mostrando un posible enfoque para el uso de la instrucción SET INTEGRITY. En este ejemplo, la extensión telefónica para el empleado 000100 se actualiza a un valor de 123, luego de lo cual se desactiva el control de la integridad de la tabla EMPLOYEE. Una restricción de control que requiere valores de extensión de cuatro dígitos se define en la tabla EMPLOYEE. Se crea una tabla de excepción denominada EMPL_EXCEPT. La definición de esta nueva tabla refleja la de la tabla EMPLOYEE. Se activa el control de integridad, con filas que violan la restricción de control en la tabla de excepción. Las consultas a estas tablas confirman que la fila en cuestión existe ahora sólo en la tabla de excepción.

Listado 7. Cómo usar la instrucción SET INTEGRITY para diferir controles de restricciones.
 db2 update employee set phoneno = '123' 
 where empno = '000100' db2
set integrity for employee off db2 alter table employee add constraint
phoneno_length check (length(rtrim(phoneno)) = 4)
db2 create table empl_except like
employee db2 set integrity for employee immediate checked for exception in employee
use empl_except SQL3602W Check data processing found constraint violations and moved
them to exception tables. SQLSTATE=01603 db2 select empno, lastname, workdept,
phoneno from empl_except EMPNO LASTNAME WORKDEPT PHONENO ------ ---------------
-------- ------- 000100 SPENSER E21 123 1 record(s) selected.

Conclusión

Este artículo explora los diversos tipos de restricciones soportadas por DB2 para Linux, UNIX y Windows, incluyendo la restricción NOT NULL, la restricción de clave única, la restricción de clave primaria, la restricción de clave externa (referencial) y las restricciones de control de tabla. DB2 usa las restricciones para aplicar reglas de negocios para los datos y para ayudar a preservar la integridad de la base de datos. Además, usted aprendió cómo usar la línea de comandos y el DB2 Control Center (y cómo consultar un catálogo de base de datos) con el fin de gestionar eficazmente las restricciones.

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Information mgmt
ArticleID=966690
ArticleTitle=Conceptos básicos sobre DB2: Limitaciones
publish-date=06182010