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

La instrucción ALTER TABLE entró en conflicto con la restricción CHECK en SQL Server - Tutorial de SQL Server/TSQL, parte 89

Escenario:

Está trabajando como desarrollador de SQL Server, se le pide que agregue Verificar restricción a una tabla existente dbo. Empleado en la columna FName y escribir lógica para Verificar restricción para que siempre acepte alfabetos.

Cuando intentó agregue la restricción de verificación, obtuvo el siguiente error.

Mensaje 547, nivel 16, estado 0, línea 19
La declaración ALTER TABLE entró en conflicto con la restricción CHECK "Chk_dbo_Employee_FName".
El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "dbo.Employee", columna 'FName'.

Solución:

Primero generemos el escenario para el error. Cree una tabla de muestra dbo.Employee con algunos datos de muestra.
--Create Table  
use YourDatabaseName
go
Create table dbo.Employee
(
FName VARCHAR(100) Not Null,
LName VARCHAR(100),
StreetAddress VARCHAR(255)
)
--Insert data in sql table
insert into dbo.Employee(FName,LName,StreetAddress)
values ('Aamir','Shahzad','xyz address')
go
insert into dbo.Employee(FName,LName,StreetAddress)
values ('Raza A',Null,'abc address')
go
 
Ahora ejecute la declaración de modificación de tabla para agregar Verificar restricción. Una vez que ejecute esta declaración, obtendrá el error anterior. ya que los datos existentes no califican para la restricción de verificación. Tenemos espacio en el primer nombre para 'Raza A' y nuestra restricción de verificación dice que los datos en FName deben ser siempre alfabéticos.
Alter table dbo.Employee
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%')
 
 
 1) Primera solución:la solución DataFist existente correcta puede ser, encuentra los datos que no califican para Verificación de restricción y los corrige y luego agrega Verificación de restricción.
2) Si la empresa no desea corregir los datos existentes y desea implementar la restricción de verificación para que no avance, puede crear la restricción de verificación con Nocheck. Al hacerlo, no validará los datos existentes contra nuestra regla de verificación de restricciones, sino que solo se aplicará a los datos nuevos.
Alter table dbo.Employee with nocheck
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%') 
 
 
 Insertemos un par de registros y verifiquemos si nuestra Restricción funciona como se esperaba.
insert into dbo.Employee(FName,LName,StreetAddress)
values ('Test 123',Null,'test address')
go

insert into dbo.Employee(FName,LName,StreetAddress)
values ('Najaf',Null,'test address')
go
 
 
 La primera inserción fallará ya que no califica con nuestra regla de verificación de restricciones. El segundo registro se insertará con éxito. Ahora revisemos los datos en la tabla.
Cómo agregar una restricción de verificación a una columna con datos existentes en SQL Server

Demostración en video:cómo corregir el error en el que la instrucción Alter table entra en conflicto con la restricción de verificación