Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

L'instruction ALTER TABLE est en conflit avec la contrainte CHECK dans SQL Server - SQL Server / TSQL Tutorial Part 89

Scénario :

Vous travaillez en tant que développeur SQL Server, il vous est demandé d'ajouter Check Constraint à une table existante dbo.Employee sur la colonne FName et d'écrire une logique pour Check Constraint afin qu'elle accepte toujours les alphabets.

Lorsque vous avez essayé de add Check Constraint, vous avez obtenu l'erreur ci-dessous.

Msg 547, Level 16, State 0, Line 19
L'instruction ALTER TABLE est en conflit avec la contrainte CHECK "Chk_dbo_Employee_FName".
Le conflit s'est produit dans la base de données "YourDatabaseName", table "dbo.Employee", colonne 'FName'.

Solution :

Commençons par générer le scénario pour l'erreur. Créez un exemple de table dbo.Employee avec des exemples de données.
--Create Table use YourDatabaseNamegoCreate table dbo.Employee(FName VARCHAR(100) Not Null,LName VARCHAR(100),StreetAddress VARCHAR(255))- -Insérer des données dans la table sqlinsert dans les valeurs dbo.Employee(FName,LName,StreetAddress) ('Aamir','Shahzad','xyz address') goinsert into dbo.Employee(FName,LName,StreetAddress)values ​​('Raza A' ,Null,'adresse abc')go
 
Exécutez maintenant l'instruction alter table pour ajouter la contrainte de vérification. Une fois que vous aurez exécuté cette instruction, vous obtiendrez l'erreur ci-dessus. car les données existantes ne sont pas éligibles pour la contrainte de vérification. Nous avons de l'espace dans le prénom pour 'Raza A' et notre contrainte de vérification indique que les données dans FName doivent toujours être des alphabets.
Alter table dbo.EmployeeAdd Constraint Chk_dbo_Employee_FNameCheck (FName not like '%[^a-z] %')
 
 
 1) Première solution :Corriger la solution DataFist existante peut être, vous trouvez les données qui ne sont pas éligibles pour la contrainte de vérification et corrigez-les, puis ajoutez la contrainte de vérification.
2) Si l'entreprise ne souhaite pas corriger les données existantes et souhaitez implémenter la contrainte de vérification à partir de maintenant, vous pouvez créer la contrainte de vérification avec Nocheck. En faisant cela, il ne validera pas les données existantes par rapport à notre règle de vérification de contrainte mais ne s'appliquera qu'aux nouvelles données.
Modifier la table dbo.Employee avec nocheckAdd Constraint Chk_dbo_Employee_FNameCheck (FName not like '%[^a-z]%') 
 
 
 Insérons quelques enregistrements et vérifions si notre contrainte fonctionne comme prévu.
insert into dbo.Employee(FName,LName,StreetAddress)values ​​('Test 123',Null,'test address')goinsert into dbo.Employee(FName,LName,StreetAddress)values ​​('Najaf',Null,'test address')go
 
 
 La première insertion échouera car elle ne répond pas à notre règle de vérification des contraintes. Le deuxième enregistrement sera inséré avec succès. Vérifions maintenant les données du tableau.
Comment ajouter une contrainte de vérification à une colonne avec des données existantes dans SQL Server

Démo vidéo :comment corriger l'erreur entre l'instruction Alter table et la contrainte de vérification