2014/12/22

CONSTRAINTS O RESTRICCIONES

Para asegurar la integridad de los datos almacenados en nuestras tablas, podemos crear restricciones, algunos los hemos utilizado sin querer o simplemente desconocemos que lo que hicimos fue una restricción, por ejemplo una llave primaria. Estas restricciones las podemos implementar al momento de crear nuestras tablas o de modificarlas, también es necesario señalar que dichas restricciones son objetos propios de la base de datos y por lo tanto requieren de un nombre único compuesto del nombre del esquema al que pertenece y el nombre que lo identifica, un ejemplo sería nombreEsquema.nombreRestriccion.

Los diferentes tipos de restricción que existen son:
  • PRIMARY KEY
  • UNIQUE
  • FOREIGN KEY
  • CHECK
  • DEFAULT
PRIMARY KEY

Es la más común de todas debido a que cada una de nuestras tablas debe ser completamente relacional y para lograr esto siempre debe existir una llave primaria dentro de cada tabla que identifique cada fila como única.

Para generar una llave primaria desde la creación de una tabla:
CREATE TABLE nombreEsquema.nombreTabla
(
 nombreColumna1 INT    NOT NULL,
 nombreColumna2 VARCHAR(100)  NOT NULL,
 nombreColumna3 NVARCHAR(200) NOT NULL,
 CONSTRAINT PK_nombreRestriccion PRIMARY KEY( nombreColumna1 )
);
Modificando una tabla:
ALTER TABLE nombreEsquema.nombreTabla
ADD CONSTRAINT PK_nombreRestriccion PRIMARY KEY( nombreColumna1 );
Es posible agregar más columnas como parte de una llave primaria, se recomienda como buena práctica utilizar una nomenclatura en el nombre de la restricción que ayude a identificar de que tipo es, además de tener especial cuidado en nombrar las columnas que forman parte de la llave primaria ya que estás mismas serán utilizadas como referencia en una llave foránea en otra tabla. Cada vez que generamos una llave primaria, esta crea un índice tipo de clustered automáticamente.

Existen ciertos requerimientos para la creación de una llave primaria:
  • La o las columnas utilizadas en una restricción PRIMARY KEY, no pueden aceptar NULL.
  • No se pueden repetir valores en la o las columnas, deben ser únicos.
  • Solamente puede existir una restricción de tipo PRIMARY KEY por cada tabla.
Para verificar  las llaves primarias contenidas en nuestra base de datos podemos utilizar el siguiente código:
SELECT *
FROM sys.key_constraints
WHERE type = 'PK';

UNIQUE

Este tipo de restricción es muy parecida a PRIMARY KEY,  las diferencias son las siguientes:
  • También genera un índice automáticamente pero es de tipo de NON CLUSTERED.
  • La tabla puede tener más de una restricción de tipo UNIQUE.
  • Si puede aceptar NULL, pero solo una fila puede contenerlo ya que como su nombre lo indica, es de tipo UNIQUE o único. 
CREATE TABLE nombreEsquema.nombreTabla
(
 nombreColumna1 INT    NULL,
 nombreColumna2 VARCHAR(100)  NOT NULL,
 nombreColumna3 NVARCHAR(200) NOT NULL,
 CONSTRAINT UQ_nombreRestriccion UNIQUE( nombreColumna1 ),
 CONSTRAINT UQ_nombreRestriccion2 UNIQUE( nombreColumna2 ),
 CONSTRAINT UQ_nombreRestriccion3 UNIQUE( nombreColumna1,nombreColumna2 )
);
Para consultar las restricciones UNIQUE se puede utilizar:
SELECT *
FROM sys.key_constraints
WHERE type = 'UQ';

FOREIGN KEY

Se forma de una columna o la combinación de varias columnas de una tabla que sirve como enlace hacia otra tabla donde en esta última, dicho enlace son la o las columnas que forman la PRIMARY KEY. En la primera tabla donde creamos la llave foránea es posible que existan valores duplicados de la/las columnas que conforman la llave primaria de la segunda tabla, además las columnas involucradas en la llave foránea deben tener el mismo tipo de datos que la llave primaria de la segunda tabla. Una llave foránea no crea un índice automáticamente, por lo que se recomienda generar uno para incrementar el rendimiento de la consulta.
CREATE TABLE nombreEsquema.nombreTabla
(
 nombreColumna1 INT    NULL,
 nombreColumna2 VARCHAR(100)  NOT NULL,
 nombreColumna3 NVARCHAR(200) NOT NULL,
 CONSTRAINT FK_nombreRestriccion FOREIGN KEY (nombreColumna1) REFERENCES nombreEsquema.otraTabla (nombreColumna1)
);
Modificando la tabla:
ALTER TABLE nombreEsquema.nombreTabla
ADD CONSTRAINT FK_nombreRestriccion FOREIGN KEY(nombreColumna1)
REFERENCES nombreEsquema.otraTabla (nombreColumna1)
Algunos requerimientos para la restricción FOREIGN KEY:
  • Los valores ingresados en la o las columnas de la llave foránea, deben existir en la tabla a la que se hace referencia en la o las columnas de la llave primaria.
  • Solo se pueden hacer referencia a llaves primaria de tablas que se encuentren dentro de la misma base de datos.
  • Puede hacer referencia a otra columnas de la misma tabla.
  • Solo puede hacer referencia a columnas de restricciones PRIMARY KEY o UNIQUE.
  • No se puede utilizar en tablas temporales.
Para consultar las restricciones FOREIGN KEY, se puede utilizar:
SELECT *
FROM sys.foreign_keys
WHERE name = 'nombreEsquema.nombreTabla’;

CHECK

Con este tipo de restricción, se especifica que los valores ingresados en la columna deben cumplir la regla o formula especificada. Por ejemplo:
CREATE TABLE nombreEsquema.nombreTabla
(
 nombreColumna1 INT    NULL,
 nombreColumna2 VARCHAR(100)  NOT NULL,
 nombreColumna3 NVARCHAR(200) NOT NULL,
 --VALORES POSITIVOS
 CONSTRAINT CH_nombreRestriccion CHECK (nombreColumna1>=0),
 -- SOLO VALORES IGUALES A 10 20 30 40
 CONSTRAINT CH_nombreRestriccion2 CHECK (nombreColumna1 IN (10,20,30,40)),
 --VALORES CONTENIDOS EN UN RANGO
 CONSTRAINT CH_nombreRestriccion3 CHECK (nombreColumna1>=1 AND nombreColumna1 <=30)
);
Modificando una tabla:
ALTER TABLE nombreEsquema.nombreTabla
ADD CONSTRAINT CH_nombreRestriccion CHECK (nombreColumna1>=0);
GO

ALTER TABLE nombreEsquema.nombreTabla
ADD CONSTRAINT CH_nombreRestriccion2 CHECK (nombreColumna1 IN (10,20,30,40));
GO

ALTER TABLE nombreEsquema.nombreTabla
ADD CONSTRAINT CH_nombreRestriccion3 CHECK (nombreColumna1>=1 AND nombreColumna1 <=30);
GO
Algunos requerimientos son:
  • Una columna puede tener cualquier número de restricciones CHECK.
  • La condición de búsqueda debe evaluarse como una expresión booleana y no puede hacer referencia a otra tabla.
  • No se pueden definir restricciones CHECK en columnas de tipo text, ntext o image.
Ventajas:
  • Las expresiones utilizadas son similares a las que se usan en la clausula WHERE.
  • Pueden llegar a ser una mejor alternativa que los TRIGGERS o disparadores.
Tener siempre en mente:
  • Al momento de crear nuestra expresión, tomar en cuenta si la columna acepta valores NULL, por ejemplo si definimos nuestra restricción que acepte solo valores positivos ( nombreColumna1>=0), NULL es un valor desconocido por lo tanto se insertará en la columna.
  • No es posible obtener el valor previo después de realizar un UPDATE, si esto es necesario se recomienda usar un TRIGGER.
Para consultar las restricciones CHECK se puede utilizar:
SELECT *
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID('nombreEsquema.nombreTabla');

DEFAULT

Se puede decir que no es una restricción, ya que solo se ingresa un valor en caso de que ninguno otro sea especificado. Si una columna permite NULL y el valor a insertar no se especifica, se puede sustituir con un valor predeterminado.
CREATE TABLE nombreTabla
(
 nombreColumna1 INT    NULL CONSTRAINT DF_nombreRestriccion DEFAULT(0),
 nombreColumna2 VARCHAR(100)  NOT NULL,
 nombreColumna3 NVARCHAR(200) NOT NULL,
);
Para obtener una lista de las restricciones DEFAULT:
SELECT *
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID('nombreEsquema.nombreTabla');
Espero que les sirva de ayuda.

SALUDOS!
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario