sql >> Databáze >  >> RDS >> Sqlserver

Příkaz ALTER TABLE byl v konfliktu s omezením CHECK v SQL Server - SQL Server / Výukový program TSQL, část 89

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')
go
 
 
 První 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


  1. Knee-Jerk PerfMon Counters:Předpokládaná životnost stránky

  2. Může mít tabulka serveru SQL dva sloupce identity?

  3. Jaké jsou výhody a nevýhody provádění výpočtů v SQL vs. ve vaší aplikaci

  4. Získání nezpracovaného řetězce dotazu SQL z připravených příkazů PDO