sql >> Base de Datos >  >> RDS >> Sqlserver

Explorando las diferentes restricciones en SQL Server

Las restricciones en SQL Server son reglas predefinidas que puede aplicar en columnas únicas o múltiples. Estas restricciones ayudan a mantener la integridad, confiabilidad y precisión de los valores almacenados en estas columnas. Puede crear restricciones mediante instrucciones CREATE TABLE o ALTER Table. Si usa la instrucción ALTER TABLE, SQL Server verificará los datos de la columna existente antes de crear la restricción.

Si inserta datos en la columna que cumple con los criterios de la regla de restricción, SQL Server inserta los datos correctamente. Sin embargo, si los datos violan la restricción, la declaración de inserción se cancela con un mensaje de error.

Por ejemplo, suponga que tiene una tabla [Empleado] que almacena los datos de los empleados de su organización, incluido su salario. Hay algunas reglas generales cuando se trata de valores en la columna de salario.

  • La columna no puede tener valores negativos como -10 000 o -15 000 USD.
  • También desea especificar el valor del salario máximo. Por ejemplo, el salario máximo debe ser inferior a 2 000 000 USD.

Si inserta un nuevo registro con una restricción, SQL Server validará el valor con las reglas definidas.

Valor insertado:

Salario 80.000:Insertado con éxito

Salario -50.000: Error

Exploraremos las siguientes restricciones en SQL Server en este artículo.

  • NO NULO
  • ÚNICO
  • COMPROBAR
  • CLAVE PRINCIPAL
  • LLAVE EXTRANJERA
  • POR DEFECTO

Restricción NO NULA

De forma predeterminada, SQL Server permite almacenar valores NULL en columnas. Estos valores NULL no representan datos válidos.

Por ejemplo, todos los empleados de una organización deben tener un ID Emp, nombre, género y dirección. Por lo tanto, puede especificar una columna con restricciones NOT NULL para garantizar siempre valores válidos.

El siguiente script CREATE TABLE define restricciones NOT NULL para las columnas [ID], [FirstName], [LastName], [Gender] y [Address].

CREATE TABLE Employees
(
ID INT NOT NULL,
[FirstName] Varchar(100) NOT NULL,
[MiddleName] Varchar(50) NULL,
[LastName] Varchar(100) NOT NULL,
[Gender] char(1) NOT NULL,
[Address] Varchar(200) NOT NULL
)

Para validar las restricciones NOT NULL, el comportamiento, usamos las siguientes declaraciones INSERT.

  • Insertar valores para todas las columnas (NULL y NOT NULL) – Se inserta correctamente
INSERT INTO Employees (ID,[FirstName],[MiddleName],[LastName],[gender],[Address]) VALUES(1,'Raj','','Gupta','M','India')
  • Insertar valores para columnas con propiedad NOT NULL – Se inserta correctamente
INSERT INTO Employees (ID,[FirstName],[LastName],[gender],[Address]) VALUES(2,
'Shyam','Agarwal','M','UK')
  • Omita la inserción de valores para la columna [LastName] que tiene restricciones NOT NULL: Falla+
INSERT INTO Employees (ID,[FirstName],[gender],[Address]) VALUES(3,'Sneha','F','India')

La última instrucción INSERT generó el error: No se pueden insertar valores NULL en la columna .

Esta tabla tiene los siguientes valores insertados en la tabla [Empleados].

Supongamos que no requerimos valores NULL en la columna [MiddleName] según los requisitos de recursos humanos. Para este propósito, puede usar la sentencia ALTER TABLE.

ALTER TABLE Employees
ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL

Esta instrucción ALTER TABLE falla debido a los valores existentes de la columna [MiddleName]. Para hacer cumplir la restricción, debe eliminar estos valores NULL y luego ejecutar la instrucción ALTER.

UPDATE Employees SET [MiddleName]='' WHERE [MiddleName] IS NULL
Go
ALTER TABLE Employees
ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL

También puede validar las restricciones NOT NULL utilizando el diseñador de tablas SSMS.

Restricción ÚNICA

La restricción ÚNICA en SQL Server garantiza que no tenga valores duplicados en una sola columna o combinación de columnas. Estas columnas deben ser parte de las restricciones ÚNICAS. SQL Server crea automáticamente un índice cuando se definen restricciones ÚNICAS. Solo puede tener un valor único en la columna (incluido NULL).

Por ejemplo, cree la [DemoTable] con la columna [ID] que tiene una restricción ÚNICA.

CREATE TABLE DemoTable
(
[ID] INT UNIQUE NOT NULL,
[EmpName] VARCHAR(50) NOT NULL
)

Luego, expanda la tabla en SSMS y tendrá un índice único (no agrupado), como se muestra a continuación.

Haga clic derecho en el índice y genere su script. Como se muestra a continuación, utiliza la palabra clave ADD UNIQUE NONCLUSTERED para la restricción.

La siguiente declaración de inserción da un error porque intenta insertar valores duplicados.

INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj')
GO
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (2,'Alisha')
GO
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj')
GO

Restricción de COMPROBACIÓN

La restricción CHECK en SQL Server define un rango válido de valores que se pueden insertar en columnas específicas. Evalúa cada valor insertado o modificado, y si se cumple, la instrucción SQL se completa con éxito.

El siguiente script SQL coloca una restricción para la columna [Edad]. Su valor debe ser mayor a 18 años.

CREATE TABLE DemoCheckConstraint
(
ID INT PRIMARY KEY,
[EmpName] VARCHAR(50) NULL,
[Age] INT CHECK (Age>18)
)
GO

Insertemos dos registros en esta tabla. La consulta inserta el primer registro con éxito.

INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (1,'Raj',20)
Go
INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (2,'Sohan',17)
GO

La segunda instrucción INSERT falla porque no cumple la condición de restricción CHECK.

Otro caso de uso para la restricción CHECK es almacenar valores válidos de códigos postales. En el siguiente script, agregamos una nueva columna [ZipCode] y usa la restricción CHECK para validar los valores.

ALTER TABLE DemoCheckConstraint ADD zipcode int
GO
ALTER TABLE DemoCheckConstraint
ADD CONSTRAINT CK_zipcode CHECK (zipcode LIKE REPLICATE ('[0-9]', 5))

Esta restricción CHECK no permite códigos postales no válidos. Por ejemplo, la segunda instrucción INSERT genera un error.

INSERT INTO DemoCheckConstraint values(3,'Sneha',19,30203)
Go
INSERT INTO DemoCheckConstraint values(4,'Jenny',21,122102)

restricción CLAVE PRINCIPAL

La restricción PRIMARY KEY en SQL Server es una opción popular entre los profesionales de bases de datos para implementar valores únicos en una tabla relacional. Combina restricciones ÚNICAS y NO NULAS. SQL Server crea automáticamente un índice agrupado una vez que definimos una restricción PRIMARY KEY. Puede usar una sola columna o un conjunto de combinaciones para definir valores únicos en una fila.

Su propósito principal es hacer cumplir la integridad de la tabla usando la entidad única o el valor de la columna.

Es similar a la restricción ÚNICA con las siguientes diferencias.

CLAVE PRINCIPAL CLAVE ÚNICA
Utiliza un identificador único para cada fila de una tabla. Define valores de forma única en una columna de tabla.
No puede insertar valores NULL en la columna PRIMARY KEY. Puede aceptar un valor NULL en la columna de clave única.
Una tabla solo puede tener una restricción PRIMARY KEY. Puede crear múltiples restricciones de CLAVE ÚNICA en SQL Server.
Por defecto, crea un índice agrupado para las columnas PRIMARY KEY. La CLAVE ÚNICA crea un índice no agrupado para las columnas de la clave principal.

El siguiente script define la CLAVE PRINCIPAL en la columna ID.

CREATE TABLE PrimaryKeyDemo
(
ID INT PRIMARY KEY,
[Name] VARCHAR(100) NULL
)

Como se muestra a continuación, tiene un índice de clave agrupada después de definir la CLAVE PRINCIPAL en la columna ID.

Insertemos los registros en la tabla [PrimaryKeyDemo] con las siguientes instrucciones INSERT.

INSERT INTO PrimaryKeyDemo ([ID],[NAME]) VALUES (1,'Raj')
GO
INSERT INTO PrimaryKeyDemo ([NAME]) VALUES ('Mohan')
GO

Obtiene un error en la segunda instrucción INSERT porque intenta insertar el valor NULL.

De manera similar, si intenta insertar valores duplicados, obtendrá el siguiente mensaje de error.

restricción de CLAVE EXTERNA

La restricción FOREIGN KEY en SQL Server crea relaciones entre dos tablas. Esta relación se conoce como relación padre-hijo. Refuerza la integridad referencial en SQL Server.

La clave externa de la tabla secundaria debe tener una entrada correspondiente en la columna de la clave primaria principal. No puede insertar valores en la tabla secundaria sin insertarlos primero en la tabla principal. Del mismo modo, primero, debemos eliminar el valor de la tabla secundaria antes de que pueda eliminarse de la tabla principal.

Dado que no podemos tener valores duplicados en la restricción PRIMARY KEY, tampoco permite duplicados o NULL en la tabla secundaria.

El siguiente script SQL crea una tabla principal con una clave principal y una tabla secundaria con una referencia de clave principal y externa a la columna [EmpID] de la tabla principal.

CREATE TABLE ParentTable
(
[EmpID] INT PRIMARY KEY,
[Name] VARCHAR(50) NULL
)
GO
CREATE TABLE ChildTable
(
[ID] INT PRIMARY KEY,
[EmpID] INT FOREIGN KEY REFERENCES ParentTable(EmpID)
)

Insertar registros en ambas tablas. Tenga en cuenta que el valor de la clave externa de la tabla secundaria tiene una entrada en la tabla principal.

INSERT INTO ParentTable VALUES (1,'Raj'),(2,'Komal')
INSERT INTO ChildTable VALUES (101,1),(102,2)

Si intenta insertar un registro directamente en la tabla secundaria que no hace referencia a la clave principal de la tabla principal, obtendrá el siguiente mensaje de error.

restricción POR DEFECTO

La restricción DEFAULT en SQL Server proporciona el valor predeterminado para una columna. Si no especificamos un valor en la declaración INSERT para la columna con la restricción DEFAULT, SQL Server usa su valor predeterminado asignado. Por ejemplo, suponga que una tabla de pedidos tiene registros para todos los pedidos de los clientes. Puede usar la función GETDATE() para capturar la fecha del pedido sin especificar ningún valor explícito.

CREATE TABLE Orders
(
[OrderID] INT PRIMARY KEY,
[OrderDate] DATETIME NOT NULL DEFAULT GETDATE()
)
GO

Para insertar los registros en esta tabla, podemos omitir la asignación de valores para la columna [FechaPedido].

INSERT INTO Orders([OrderID]) values (1)
GO

SELECCIONE * DESDE Pedidos

Una vez que la columna de restricción DEFAULT especifica un valor explícito, SQL Server almacena este valor explícito en lugar del valor predeterminado.

Beneficios de restricción

Las restricciones en SQL Server pueden ser beneficiosas en los siguientes casos:

  • Hacer cumplir la lógica empresarial
  • Reforzar la integridad referencial
  • Evitar el almacenamiento de datos inadecuados en tablas de SQL Server
  • Reforzar la exclusividad de los datos de columna
  • Mejorar el rendimiento de las consultas ya que el optimizador de consultas reconoce datos únicos y valida conjuntos de valores
  • Evitar el almacenamiento de valores NULL en tablas SQL
  • Escribir códigos para evitar NULL mientras se muestran datos en la aplicación