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.
- 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.
- 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