Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

A instrução ALTER TABLE entrou em conflito com a restrição CHECK no SQL Server - SQL Server / TSQL Tutorial Part 89

Cenário:

Você está trabalhando como desenvolvedor do SQL Server, você é solicitado a adicionar Check Constraint a uma tabela existente dbo.Employee na coluna FName e escrever lógica para Check Constraint para que ele sempre aceite alfabetos.

Quando você tentou adicione Check Constraint, você tem o erro abaixo.

Msg 547, Level 16, State 0, Line 19
A instrução ALTER TABLE entrou em conflito com a restrição CHECK "Chk_dbo_Employee_FName".
O conflito ocorreu no banco de dados "YourDatabaseName", tabela "dbo.Employee", coluna 'FName'.

Solução:

Vamos gerar o cenário primeiro para o erro. Crie uma tabela de amostra dbo.Employee com alguns dados de amostra.
--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
 
Agora execute a instrução alter table para adicionar Check Constraint. Depois de executar esta instrução, você receberá o erro acima. pois os dados existentes não se qualificam para Check Constraint. Temos espaço no primeiro nome para 'Raza A' e nossa Check Constraint diz que os dados em FName devem ser sempre alfabetos.
Alter table dbo.Employee
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%')
 
 
 1) Primeira Solução:Corrigir a solução DataFist existente pode ser, você encontra os dados que não se qualificam para Check Constraint e corrige isso e depois adiciona Check Constraint.
2) Se a empresa não quiser corrigir os dados existentes e quiser implementar a restrição de verificação de avançar, você pode criar a restrição de verificação com Nocheck. Ao fazer isso, ele não validará os dados existentes em relação à nossa regra Check Constraint, mas apenas se aplicará a novos dados.
Alter table dbo.Employee with nocheck
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%') 
 
 
 Vamos inserir alguns registros e verificar se nossa restrição está funcionando conforme o esperado.
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
 
 
 A primeira inserção falhará, pois não se qualifica com nossa regra de restrição de verificação. O segundo registro será inserido com sucesso. Vamos verificar os dados na tabela agora.
Como adicionar restrição de verificação à coluna com dados existentes no SQL Server

Demonstração de vídeo:como corrigir o erro da instrução da tabela Alter em conflito com a restrição de verificação