Scenariusz:
Pracujesz jako programista SQL Server, zostaniesz poproszony o dodanie Check Constraint do jednej istniejącej tabeli dbo.Employee w kolumnie FName i napisanie logiki dla Check Constraint, aby zawsze akceptował alfabety.Kiedy próbowałeś add Check Constraint, wystąpił błąd poniżej.
Msg 547, Level 16, State 0, Line 19
Instrukcja ALTER TABLE spowodowała konflikt z ograniczeniem CHECK "Chk_dbo_Employee_FName".
Konflikt wystąpił w bazie danych „NazwaBazyDanych”, tabela „dbo.Pracownik”, kolumna „NazwaF”.
Rozwiązanie:
Najpierw wygenerujmy scenariusz błędu. Utwórz przykładową tabelę dbo.Employee z przykładowymi danymi.--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
Teraz uruchom instrukcję alter table, aby dodać ograniczenie sprawdzania. Po wykonaniu tej instrukcji otrzymasz powyższy błąd. ponieważ istniejące dane nie kwalifikują się do ograniczenia sprawdzania. Mamy spację w imieniu dla „Raza A”, a nasze ograniczenie sprawdzania mówi, że dane w FName powinny być zawsze alfabetami.
Alter table dbo.Employee Add Constraint Chk_dbo_Employee_FName Check (FName not like '%[^a-z]%')1) Pierwsze rozwiązanie:Poprawne istniejące rozwiązanie DataFist może polegać na znalezieniu danych, które nie kwalifikują się do sprawdzenia ograniczenia i poprawie ich, a następnie dodaniu Sprawdź ograniczenie.
2) Jeśli firma nie chce naprawiać istniejących danych i chcesz zaimplementować ograniczenie sprawdzania z postępu, możesz utworzyć ograniczenie sprawdzania bez sprawdzania. W ten sposób nie zweryfikuje istniejących danych względem naszej reguły sprawdzania ograniczeń, ale będzie stosowany tylko do nowych danych.
Alter table dbo.Employee with nocheck Add Constraint Chk_dbo_Employee_FName Check (FName not like '%[^a-z]%')Wstawmy kilka rekordów i sprawdźmy, czy nasze ograniczenie działa zgodnie z oczekiwaniami.
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') goPierwsza wstawka nie powiedzie się, ponieważ nie spełnia wymagań naszej reguły Sprawdź ograniczenie. Drugi rekord zostanie wstawiony pomyślnie. Sprawdźmy teraz dane w tabeli.
Jak dodać sprawdzanie ograniczenia do kolumny z istniejącymi danymi w SQL Server |
Prezentacja wideo:Jak naprawić błąd instrukcji Alter table, która była w konflikcie z poleceniem Check Constraint