sql >> Database teknologi >  >> RDS >> Sqlserver

ALTER TABLE-sætningen var i konflikt med CHECK-begrænsningen i SQL Server - SQL Server / TSQL Selvstudium, del 89

Scenarie:

Du arbejder som SQL Server-udvikler, du bliver bedt om at tilføje Check Constraint til en eksisterende tabel dbo.Employee on FName-kolonnen og skrive logik for Check Constraint, så den altid skal acceptere alfabeter.

Da du forsøgte at tilføj Check Constraint, du fik under fejl.

Besked 547, Niveau 16, State 0, Line 19
ALTER TABLE-sætningen var i konflikt med CHECK-begrænsningen "Chk_dbo_Employee_FName".
Konflikten opstod i databasen "YourDatabaseName", tabel "dbo.Employee", kolonnen 'FName'.

Løsning:

Lad os generere scenariet først for fejlen. Opret eksempeltabel dbo.Employee med nogle eksempeldata.
--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
 
Kør nu alter table-sætningen for at tilføje Check Constraint. Når du vil udføre denne sætning, får du ovenstående fejl. da eksisterende data ikke kvalificerer sig til Check Constraint. Vi har plads i fornavnet til 'Raza A', og vores Check Constraint siger, at dataene i FName altid skal være alfabeter.
Alter table dbo.Employee
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%')
 
 
 1) Første løsning:Korrekt Eksisterende DataFist-løsning kan være, at du finder de data, der ikke kvalificerer sig til Check Constraint og retter det og tilføjer derefter Check Constraint.
2) Hvis virksomheden ikke ønsker at rette de eksisterende data og ønsker at implementere Check Constraint fra fremadrettet, kan du oprette Check Constraint med Nocheck. Ved at gøre det vil det ikke validere eksisterende data mod vores Check Constraint-regel, men kun gælde for nye data.
Alter table dbo.Employee with nocheck
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%') 
 
 
 Lad os indsætte et par poster og kontrollere, om vores begrænsning fungerer som forventet.
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
 
 
 Den første indsættelse mislykkes, da den ikke opfylder vores Check Constraint-regel. Anden post vil blive indsat. Lad os tjekke dataene i tabellen nu.
Sådan tilføjes Check Constraint til kolonne med eksisterende data i SQL Server

Videodemo :Sådan rettes fejlen Alter-tabellsætningen kom i konflikt med Check Constraint


  1. Igen og igen! Håndtering af tilbagevendende hændelser i en datamodel

  2. Psql liste over alle tabeller

  3. Indstilling af kolonneværdier som kolonnenavne i SQL-forespørgselsresultatet

  4. Hvordan laver man en masseindsættelse i MySQL?