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') goA 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