Scénář:
Pracujete jako vývojář SQL Server, budete požádáni o přidání Check Constraint do jedné existující tabulky dbo.Employee ve sloupci FName a zapsání logiky pro Check Constraint tak, aby vždy akceptovala abecedy.Když jste se to pokusili add Check Constraint, máte níže uvedenou chybu.
Zpráva 547, úroveň 16, stav 0, řádek 19
Příkaz ALTER TABLE byl v konfliktu s omezením CHECK "Chk_dbo_Employee_FName".
Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Employee", sloupci 'FName'.
Řešení:
Nejprve vygenerujeme scénář pro chybu. Vytvořte ukázkovou tabulku dbo.Employee s některými ukázkovými daty.--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
Nyní spusťte příkaz alter table pro přidání kontroly omezení. Jakmile provedete toto prohlášení, dostanete výše uvedenou chybu. protože existující data nesplňují podmínky pro kontrolu omezení. Máme mezeru v křestním jménu pro 'Raza A' a naše kontrola omezení říká, že data v FName by měla být vždy abeceda.
Alter table dbo.Employee Add Constraint Chk_dbo_Employee_FName Check (FName not like '%[^a-z]%')1) První řešení:Správné existující řešení DataFist může být, najdete data, která nesplňují podmínky pro kontrolu omezení a opravte je a poté přidejte kontrolní omezení.
2) Pokud firma nechce opravit stávající data a chcete implementovat Check Constraint z pohybu vpřed, můžete vytvořit Check Constraint pomocí Nocheck. Tím se neověří existující data podle našeho pravidla Check Constraint, ale použije se pouze na nová data.
Alter table dbo.Employee with nocheck Add Constraint Chk_dbo_Employee_FName Check (FName not like '%[^a-z]%')Vložíme několik záznamů a zkontrolujeme, zda naše omezení funguje podle očekávání.
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') goPrvní vložení se nezdaří, protože nesplňuje podmínky našeho pravidla kontroly omezení. Druhý záznam bude úspěšně vložen. Nyní zkontrolujeme data v tabulce.
Jak přidat omezení kontroly do sloupce se stávajícími daty na serveru SQL |
Video ukázka:Jak opravit chybu, že příkaz Alter table je v konfliktu s omezením kontroly