Сценарий:
Вие работите като разработчик на SQL Server, от вас се иска да добавите Check Constraint към една съществуваща таблица dbo.Employee в колона FName и да напишете логика за Check Constraint, така че винаги да приема азбуки.Когато се опитате да добавете контролно ограничение, получихте грешка по-долу.
Съобщение 547, ниво 16, състояние 0, ред 19
Изразът ALTER TABLE е в конфликт с ограничението CHECK "Chk_dbo_Employee_FName".
Конфликтът възникна в база данни „YourDatabaseName“, таблица „dbo.Employee“, колона „FName“.
Решение:
Нека първо генерираме сценария за грешката. Създайте примерна таблица dbo.Employee с някои примерни данни.--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
Сега изпълнете оператора alter table, за да добавите Check Constraint. След като изпълните този оператор, ще получите горната грешка. тъй като съществуващите данни не отговарят на изискванията за проверка на ограничението. Имаме място в първото име за „Raza A“ и нашето ограничение за проверка казва, че данните във FName трябва винаги да са азбучни.
Alter table dbo.Employee Add Constraint Chk_dbo_Employee_FName Check (FName not like '%[^a-z]%')1) Първо решение:Може да коригирате съществуващото решение DataFist, да намерите данните, които не отговарят на изискванията за проверка на ограничението и да ги коригирате и след това да добавите проверка на ограничението.
2) Ако бизнесът не иска да коригира съществуващите данни и ако искате да приложите Check Constraint от движение напред, можете да създадете Check Constraint с Nocheck. Правейки това, няма да потвърди съществуващите данни спрямо нашето правило за проверка на ограничението, а ще се приложи само към нови данни.
Alter table dbo.Employee with nocheck Add Constraint Chk_dbo_Employee_FName Check (FName not like '%[^a-z]%')Нека вмъкнем няколко записа и да проверим дали нашето ограничение работи както се очаква.
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Първото вмъкване ще се провали, тъй като не отговаря на изискванията на нашето правило за проверка на ограничението. Вторият запис ще бъде вмъкнат успешно. Нека сега проверим данните в таблицата.
Как да добавите ограничение за проверка към колона със съществуващи данни в SQL Server |
Видео демонстрация:Как да коригирате грешка, изразът Alter table е в конфликт с ограничението за проверка