sql >> Database >  >> RDS >> Sqlserver

De instructie ALTER TABLE is in strijd met de beperking CHECK in SQL Server - SQL Server / TSQL-zelfstudie, deel 89

Scenario:

U werkt als SQL Server-ontwikkelaar, u wordt gevraagd om Check Constraint toe te voegen aan één bestaande tabel dbo.Employee op FName-kolom en logica te schrijven voor Check Constraint, zodat het altijd alfabetten moet accepteren.

Toen u probeerde add Check Constraint, je hebt onderstaande fout.

Msg 547, Level 16, State 0, Line 19
De ALTER TABLE-instructie was in strijd met de CHECK-constraint "Chk_dbo_Employee_FName".
Het conflict deed zich voor in database "YourDatabaseName", tabel "dbo.Employee", kolom 'FName'.

Oplossing:

Laten we eerst het scenario voor de fout genereren. Maak een voorbeeld-dbo.Employee-tabel met enkele voorbeeldgegevens.
--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
 
Voer nu de instructie alter table uit om Check Constraint toe te voegen. Zodra u deze verklaring uitvoert, krijgt u bovenstaande foutmelding. aangezien bestaande gegevens niet in aanmerking komen voor Check Constraint. We hebben ruimte in de voornaam voor 'Raza A' en onze controlebeperking zegt dat de gegevens in FName altijd alfabetten moeten zijn.
Alter table dbo.Employee
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%')
 
 
 1) Eerste oplossing:Correct bestaande DataFist-oplossing kan zijn, u zoekt de gegevens die niet in aanmerking komen voor Check Constraint en corrigeert dat en voegt vervolgens Check Constraint toe.
2) Als bedrijven de bestaande gegevens niet willen herstellen en Als u Check Constraint vanaf het begin wilt implementeren, kunt u de Check Constraint maken met Nocheck. Door dat te doen, worden bestaande gegevens niet getoetst aan onze Check Constraint-regel, maar alleen van toepassing op nieuwe gegevens.
Alter table dbo.Employee with nocheck
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%') 
 
 
 Laten we een paar records invoegen en controleren of onze beperking werkt zoals verwacht.
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
 
 
 De eerste invoeging zal mislukken omdat deze niet in aanmerking komt voor onze Check Constraint-regel. Het tweede record wordt met succes ingevoegd. Laten we nu de gegevens in de tabel controleren.
Controlebeperking toevoegen aan kolom met bestaande gegevens in SQL Server

Videodemo:hoe u een fout oplost waarbij de instructie Alter table in conflict was met de Check Constraint


  1. MySQLDumper:een op PHP en Perl gebaseerde MySQL-databaseback-uptool

  2. LEN() versus DATALENGTH() in SQL Server

  3. Interne SQL Server:problematische operators Pt. Ik – Scans

  4. Referentiewaarde van seriële kolom in een andere kolom tijdens dezelfde INSERT