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

L'istruzione ALTER TABLE era in conflitto con il vincolo CHECK in SQL Server - Tutorial SQL Server/TSQL Parte 89

Scenario:

Stai lavorando come sviluppatore di SQL Server, ti viene chiesto di aggiungere Check Constraint a una tabella esistente dbo.Employee sulla colonna FName e scrivere la logica per Check Constraint in modo che dovrebbe sempre accettare alfabeti.

Quando hai provato a farlo add Check Constraint, hai un errore inferiore.

Msg 547, Level 16, State 0, Line 19
L'istruzione ALTER TABLE era in conflitto con il vincolo CHECK "Chk_dbo_Employee_FName".
Il conflitto si è verificato nel database "YourDatabaseName", tabella "dbo.Employee", colonna 'FName'.

Soluzione:

Generiamo prima lo scenario per l'errore. Crea una tabella dbo.Employee di esempio con alcuni dati di esempio.
--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
 
Ora esegui l'istruzione alter table per aggiungere Check Constraint. Una volta che eseguirai questa istruzione, otterrai un errore superiore. poiché i dati esistenti non si qualificano per il vincolo di controllo. Abbiamo spazio nel nome per "Raza A" e il nostro Check Constraint dice che i dati in FName dovrebbero essere sempre alfabeti.
Alter table dbo.Employee
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%')
 
 
 1) Prima soluzione:può essere corretta la soluzione DataFist esistente, trovare i dati che non si qualificano per il vincolo di controllo e correggerli, quindi aggiungere il vincolo di controllo.
2) Se l'azienda non desidera correggere i dati esistenti e se si desidera implementare Check Constraint dall'andare avanti, è possibile creare il Check Constraint con Nocheck. In questo modo non convaliderà i dati esistenti rispetto alla nostra regola di controllo del vincolo, ma si applicherà solo ai nuovi dati.
Alter table dbo.Employee with nocheck
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%') 
 
 
 Inseriamo un paio di record e controlliamo se il nostro vincolo funziona come previsto.
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
 
 
 Il primo inserimento fallirà in quanto non si qualifica con la nostra regola di controllo del vincolo. Il secondo record verrà inserito correttamente. Ora controlliamo i dati nella tabella.
Come aggiungere il vincolo di controllo alla colonna con dati esistenti in SQL Server

Video demo:come correggere l'errore l'istruzione della tabella Alter era in conflitto con il vincolo di controllo