Ahmad Yaseen

Restricciones en SQL Server: SQL NOT NULL, UNIQUE y SQL PRIMARY KEY

December 16, 2019 by

Este artículo explica las restricciones SQL NOT NULL, Unique y SQL Primary Key en SQL Server con ejemplos

Las restricciones en SQL Server son reglas y restricciones predefinidas que se aplican en una sola columna o en varias columnas, relacionados a los valores permitidos en las columnas, para mantener la integridad, precisión y confiabilidad de los datos de esa columna. En otras palabras, si los datos insertados cumplen con la regla de restricción, se insertarán con éxito. Si los datos insertados violan la restricción definida, la operación de inserción se cancelará.

Las restricciones en SQL Server se pueden considerar a nivel de columna, donde se especifica como parte de la definición de columna y se aplicarán solo a esa columna, o se declararán de forma independiente a nivel de tabla. En este caso, las reglas de restricción se aplicarán a más de una columna en la tabla especificada. La restricción se puede crear dentro del comando CREATE TABLE T-SQL al crear la tabla o agregarse usando el comando ALTER TABLE T-SQL después de crear la tabla. Al agregar la restricción después de crear la tabla, se verificará previamente la regla de restricción en los datos existentes antes de crear esa restricción.

Hay seis restricciones principales que se usan comúnmente en SQL Server que describiremos en profundidad con ejemplos en este artículo y en el siguiente. Estas restricciones son:

  • SQL NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • DEFAULT

En este artículo, veremos las tres primeras restricciones; SQL NOT NULL, UNIQUE y SQL PRIMARY KEY, y completaremos las tres restricciones restantes en el próximo artículo. Comencemos discutiendo cada una de estas restricciones de SQL Server con una breve descripción y una demostración práctica.

Restricción NOT NULL en SQL

Por defecto, las columnas pueden contener valores NULL. Se usa una restricción NOT NULL en SQL para evitar insertar valores NULL en la columna especificada, considerándolo entonces como un valor no aceptado para esa columna. Esto significa que debe proporcionar un valor válido SQL NOT NULL a esa columna en las instrucciones INSERT o UPDATE, ya que la columna siempre contendrá datos.

Suponga que tenemos la siguiente instrucción simple de CREATE TABLE que se utiliza para definir la tabla ConstraintDemo1. Esta tabla contiene solo dos columnas, ID y Nombre. En la instrucción de definición de la columna ID, se aplica la restricción de nivel de columna SQL NOT NULL, considerando la columna ID como una columna obligatoria que debe proporcionarse con un valor válido SQL NOT NULL. El caso es diferente para la columna Nombre que puede ignorarse en la instrucción INSERT, con la capacidad de proporcionarle un valor NULL. Si no se especifica la capacidad nula al definir la columna, la misma aceptará el valor NULL de forma predeterminada:

Si intentamos realizar las siguientes tres operaciones de inserción:

Usted Verá que el primer registro se insertará correctamente, ya que los valores de las columnas ID y Nombre se proporcionan en la instrucción INSERT. El proporcionar solamente la ID en la segunda instrucción INSERT no impedirá que el proceso de inserción se complete con éxito, debido a que la columna Nombre no es obligatoria y acepta valores NULL. La última operación de inserción fallará, ya que solo proporcionamos en la instrucción INSERT un valor para la columna Nombre, sin proporcionar el valor para la columna ID el mismo que es obligatorio y no se le puede asignar un valor NULL, como se muestra en el mensaje de error a continuación:

SQL Server Constraints in SQL Server examples

Al verificar los datos insertados, usted verá que solo se insertan dos registros y el valor que falta para la columna Nombre en la segunda instrucción INSERT será NULL, que es el valor predeterminado, como se muestra en el resultado a continuación:

https://s33046.pcdn.co/wp-content/uploads/2017/10/word-image-160.png

Suponga que necesitamos evitar que la columna Nombre de la tabla anterior acepte valores NULL después de crear la tabla, entonces utilizando la siguiente instrucción T-SQL ALTER TABLE:

Usted Verá que el comando fallará, ya que el mismo primero comprobará los valores existentes de la columna Nombre para valores NULL previamente antes de crear la restricción, como se muestra en el mensaje de error a continuación:

sql not null examples using alter table statement

Para reforzar y aplicar las restricciones NOT NULL en SQL, debemos eliminar todos los valores NULL de la columna Nombre de la tabla, utilizando la siguiente instrucción UPDATE, que reemplaza los valores NULL con una cadena vacía:

Si usted intenta crear las Restricciones en SQL nuevamente, la misma se creará con éxito como se muestra a continuación:

https://s33046.pcdn.co/wp-content/uploads/2017/10/word-image-162.png

La restricción SQL NOT NULL también se puede crear utilizando SQL Server Management Studio, haciendo clic en el botón derecho en la tabla necesaria y seleccionando la opción Diseño. Al lado de cada columna, usted encontrará una pequeña casilla de verificación que puede usar para especificar la capacidad nula de esa columna. Al desmarcar la casilla de verificación junto a la columna, entonces se creará automáticamente una restricción SQL NOT NULL, evitando que se inserte cualquier valor NULL en esa columna, como se muestra a continuación:

https://s33046.pcdn.co/wp-content/uploads/2017/10/word-image-163.png

Restricciones ÚNICAS en SQL

La restricción UNIQUE en SQL se utiliza para garantizar que no se inserten valores duplicados en una columna específica o combinación de columnas que participen en la restricción UNIQUE y no formen parte de la CLAVE PRIMARIA. En otras palabras, el índice que se crea automáticamente cuando define una restricción ÚNICA garantizará que no haya dos filas en esa tabla que puedan tener el mismo valor para las columnas que participan en ese índice, con la capacidad de insertar solo un valor NULL único en estos columnas, esto si la columna permite NULL.

Creemos una pequeña tabla con dos columnas, ID y Nombre. La columna de ID no puede contener valores duplicados debido a la restricción ÚNICA especificada con la definición de columna. No hay restricciones definidas en la columna Nombre, como en la siguiente instrucción CREATE TABLE T-SQL:

Si intentamos ejecutar las cuatro instrucciones INSERT a continuación:

Los dos primeros registros se insertarán correctamente, sin las restricciones que impidan los valores duplicados de la columna Nombre. El tercer registro también se insertará correctamente, ya que la única columna de ID solo permite un valor NULL. La última instrucción INSERT fallará, ya que la columna ID no permite valores duplicados y el valor ID proporcionado ya está insertado en esa columna, como se muestra en el mensaje de error a continuación:

Unique constraint in SQL

Las tres filas insertadas serán las que se muestran a continuación:

sample data

El objeto del sistema INFORMATION_SCHEMA.TABLE_CONSTRAINTS puede ser usado fácilmente para recuperar información sobre todas las restricciones definidas en una tabla específica utilizando el script T-SQL a continuación:

El resultado de la consulta anterior nos mostrará la restricción UNIQUE definida en SQL en la tabla proporcionada, que será como:

UNIQUE constraint in SQL

Usando el nombre de restricción recuperado del objeto del sistema INFORMATION_SCHEMA.TABLE_CONSTRAINTS, podemos eliminar la restricción ÚNICA usando ALTER TABLE… DROP CONSTRAINT en el comando SQL T-SQL a continuación:

Si usted previamente intenta ejecutar la instrucción INSERT fallida anteriormente, el registro con el valor de ID duplicado se insertará correctamente:

Insert into command

Intentando agregar la restricción ÚNICA en SQL nuevamente usando ALTER TABLE… ADD CONSTRAINT Comando T-SQL a continuación:

La restricción en la creación de SQL fallará debido a que tiene valores duplicados de esa columna en la tabla, tal como se muestra en el mensaje de error a continuación:

Duplicate value in SQL Constaint

Verificando los datos insertados, vemos que los valores duplicados serán claros como se muestra a continuación:

Check inserted data

Para añadir la restricción ÚNICA, se tiene la opción de eliminar o modificar los valores duplicados. En nuestro caso, actualizaremos el segundo valor de ID duplicado usando la siguiente instrucción de ACTUALIZAR:

Ahora, la restricción UNIQUE en SQL se puede agregar sin error a la columna ID como se ve líneas abajo:

UNIQUE constraint

La clave ÚNICA se puede ver utilizando SQL Server Management Studio, expandiendo el nodo de las Claves debajo de la tabla seleccionada. Usted también puede ver el índice creado automáticamente que se utiliza para garantizar la unicidad de los valores de columna. Tenga en cuenta que no podrá eliminar ese índice sin eliminar primero la restricción ÚNICA:

UNIQUE constraint

Además de que previamente los comandos T-SQL mostrados anteriormente, la restricción UNIQUE también se puede definir y modificar utilizando SQL Server Management Studio. Haga clic en el botón derecho en la tabla necesaria y elija Diseño. Desde la ventana Diseño, haga clic con el botón derecho en esa ventana y elija Índices/Teclas, desde donde se puede marcar la restricción como ÚNICA, como se muestra a continuación:

Index key properties

Restricción CLAVE PRIMARIA SQL

La restricción PRIMARY KEY consta de una columna o varias columnas con valores que identifican de forma única cada fila de la tabla.

La restricción PRIMARY KEY de SQL se combina entre las restricciones UNIQUE y SQL NOT NULL, donde la columna o el conjunto de columnas que participan en PRIMARY KEY no pueden aceptar el valor NULL. Si la CLAVE PRIMARIA se define en varias columnas, entonces se puede insertar valores duplicados en cada columna individualmente, pero es importante mencionar que los valores de combinación de todas las columnas de CLAVE PRIMARIA deben ser únicos. Tenga en cuenta que solo puede definir una CLAVE PRIMARIA por cada tabla, y se recomienda utilizar columnas pequeñas o INT en la CLAVE PRIMARIA.

Además de proporcionar un acceso rápido a los datos de la tabla, el índice que se crea automáticamente, al definir la CLAVE PRIMARIA de SQL, impondrá cualidad de la unicidad de los datos. La CLAVE PRIMARIA se usa principalmente para imponer la integridad de la entidad de la tabla. La integridad de la entidad garantiza que cada fila de la tabla sea de forma única una entidad identificable.

Se puede advertir que La restricción PRIMARY KEY difiere de la restricción UNIQUE en eso; usted puede crear múltiples restricciones ÚNICAS en una tabla, con la capacidad de definir solo una CLAVE PRIMARIA SQL por cada tabla. Otra diferencia es que la restricción UNIQUE permite un valor NULL, pero la PRIMARY KEY no permite valores NULL.

Supongamos que tenemos la siguiente tabla simple con dos columnas; la identificación y el nombre. La columna de ID se define como una CLAVE PRIMARIA para esa tabla, la que se utiliza para identificar cada fila en esa tabla de tal forma asegurando que no se inserten valores NULL o duplicados en esa columna de ID. La tabla se define usando el script CREATE TABLE T-SQL a continuación:

Si intenta ejecutar las tres instrucciones INSERT a continuación:

Usted Verá que el primer registro se insertará exitosamente y correctamente ya que los valores de ID y Nombre son válidos. La segunda operación de inserción fallará, ya que la columna ID es obligatoria y no puede ser NULL, ya que la columna ID es la CLAVE PRIMARIA SQL. La última instrucción INSERT también fallará ya que el valor de ID proporcionado ya existe y los valores duplicados ya no están permitidos en la CLAVE PRIMARIA, tal como se muestra en el siguiente mensaje de error:

SQL PRIMARY KEY

Verificando los valores insertados, usted verá que solo el primer registro se inserta correctamente como se muestra a continuación:

SQL table sample data

Si usted no proporciona la restricción CLAVE PRIMARIA de SQL con un nombre durante la definición de la tabla, el motor de SQL Server será quien le proporcionará un nombre único como puede ver al consultar el objeto del sistema INFORMATION_SCHEMA.TABLE_CONSTRAINTS a continuación:

Con el siguiente resultado en nuestro ejemplo:

querying the INFORMATION_SCHEMA.TABLE_CONSTRAINTS

La instrucción ALTER TABLE… DROP CONSTRAINT T-SQL se puede usar fácilmente para cargar la CLAVE PRIMARIA previamente definida usando el nombre derivado del resultado anterior:

Si usted intenta ejecutar las anteriormente fallidas instrucciones INSERT, verá que el primer registro no se insertará ya que la columna ID no permite valores NULL. El segundo registro se insertará con éxito, ya que esto no impide que los valores duplicados se inserten después de cargar la CLAVE PRIMARIA de SQL, como se muestra a continuación:

Insert record after dropping SQL Primary key

Intentando nuevamente añadir la restricción CLAVE PRIMARIA SQL usando la consulta ALTER TABLE T-SQL a continuación se tiene que:

La operación fallará, ya que al verificar primero los valores de ID existentes para cualquier valor NULL o duplicado, SQL Server encuentra un valor de ID duplicado de 1 como se muestra en el siguiente mensaje de error:

NULL values in SQL Primary Key

Al verificar los datos de la tabla, también se mostrará el valor duplicado:

Sample data

Para agregar la restricción PRIMARY KEY, lo primero que debemos hacer es borrar los datos, eliminando o modificando el registro duplicado. Aquí cambiaremos el segundo valor de ID de registro usando la instrucción siguiente de ACTUALIZAR:

Luego, intente añadir la CLAVE PRIMARIA de SQL, que ahora se creará con éxito:

ADD Primary key using alter table

La restricción CLAVE PRIMARIA de SQL también se puede definir y modificar mediante SQL Server Management Studio. Haga clic en el botón derecho en su tabla y luego elija Diseño. Desde la ventana Diseño, haga clic con el botón derecho en la columna o conjunto de columnas que participarán en la restricción PRIMARY KEY y en la opción Establecer PRIMARY KEY, lo que desmarcará automáticamente la casilla de verificación Permitir NULL, como se muestra a continuación:

Set Primary Key

Por favor Consulte el siguiente artículo de la serie Restricciones de SQL Server de uso común: FOREIGN KEY, CHECK y DEFAULT el que describe otras tres restricciones de SQL Server.

Enlaces útiles

Ahmad Yaseen
Restricciones

Acerca de Ahmad Yaseen

Ahmad Yaseen is a Microsoft Big Data engineer with deep knowledge and experience in SQL BI, SQL Server Database Administration and Development fields. He is a Microsoft Certified Solution Expert in Data Management and Analytics, Microsoft Certified Solution Associate in SQL Database Administration and Development, Azure Developer Associate and Microsoft Certified Trainer. Also, he is contributing with his SQL tips in many blogs. View all posts by Ahmad Yaseen

168 Views