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

L'instruction UPDATE est en conflit avec la contrainte REFERENCE - SQL Server / TSQL Tutorial Part 76

Scénario :

Vous travaillez en tant que développeur SQL Server, vous avez écrit une instruction de mise à jour pour l'un des tableaux et vous obtenez l'erreur ci-dessous.


Msg 547, niveau 16, état 0, ligne 32
L'instruction UPDATE est en conflit avec la contrainte REFERENCE "FK_".
Le conflit s'est produit dans la base de données "YourDatabaseName", table "SchemaName.YourTableName", colonne 'ColumnName'.
L'instruction a été interrompue.

Comment résoudre ce problème ?

Solution :

Créons d'abord cette erreur en utilisant le script ci-dessous. Nous allons créer deux tables dbo.Customer et dbo.Orders. Les tables ont une relation clé primaire-étrangère.

USE YourDatabaseNameGOCREATE TABLE dbo.Customer ( Customerid INT PRIMARY KEY ,FName VARCHAR(100) ,LName VARCHAR(100) ,SSN VARCHAR(10) ) CREATE TABLE dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,Customer_id INT FOREIGN KEY REFERENCES Customer(CustomerId) ) --insert sample data insert into dbo.Customer (CustomerId,FName, LName ,SSN) valeurs (1,'Aamir','Shahzad','000-000-00') insérées dans dbo.Orders (OrderItemName,OrderItemAmt,Customer_Id) valeurs ('TV',1,1)
 
 
Comment mettre à jour l'enregistrement lorsque la colonne est référencée par une contrainte de clé étrangère dans SQL Server

Disons maintenant si vous pensez que la valeur CustomerId est incorrecte dans dbo.Customer et doit être mise à jour. Vous avez écrit ci-dessous la déclaration de mise à jour pour mettre à jour CustomerId à 100.
 update dbo.Customer set Customerid=100
 
Vous obtiendrez l'erreur ci-dessous.
Msg 547, Niveau 16, État 0, Ligne 33L'instruction UPDATE est en conflit avec la contrainte REFERENCE "FK__Orders__Customer__1ED998B2". Le conflit s'est produit dans la base de données "YourDatabaseName", table "dbo.Orders", colonne 'Customer_id'. La déclaration a été terminée.
Comme il n'y a pas de Customer_id value=100 dans la table dbo.Orders, vous ne pouvez pas mettre à jour l'enregistrement dans la table de référence. Maintenant, vous pensiez que nous allons d'abord corriger la table Parent (dbo.Orders) et ensuite je peux mettre à jour la table dbo.Customer.
 update dbo.Orders set Customer_Id=100
 
 
 Encore une fois, vous avez l'erreur comme indiqué ci-dessous, car nous n'avons pas CustomerId =100 disponible dans la table dbo.Customer. ". Le conflit s'est produit dans la base de données "YourDatabaseName", table "dbo.Customer", colonne 'Customerid'. La déclaration a été terminée.

À partir de là, nous pouvons proposer plusieurs solutions 1) Au lieu de mettre à jour l'enregistrement, insérez l'enregistrement dans la table de référence (Dbo.Customer), puis mettez à jour l'enregistrement dans la table parent (Dbo.Orders) et enfin supprimez les enregistrements existants de la table de référence.
 --Insert Enregistrement dans la table de référence Insérez d'abord dans dbo.Customer (CustomerId, FName, LName, SSN) les valeurs (100, 'Aamir', 'Shahzad', '000-000-00') --Mettre à jour les enregistrements dans la mise à jour de la table parent dbo. Orders set Customer_Id=100 --Supprimer l'ancien enregistrement de la table de référence Supprimer de dbo.Customer où CustomerId=1
 
 
 Vérifiez les enregistrements dans le tableau maintenant.
Comment mettre à jour la valeur de colonne lorsqu'elle est référencée par une contrainte de clé étrangère dans SQL Server

2) Désactiver la contrainte de clé étrangère et mettre à jour les valeurs manuellement Une autre solution peut être de désactiver la contrainte de clé étrangère, de mettre à jour les enregistrements et enfin de réactiver la clé étrangère.
--Trouvez la contrainte de clé étrangère avec le nom de la table USE YourDatabaseName GO Sélectionnez Schema_name(Schema_id) comme SchemaName, object_name(Parent_object_id) comme TableName, nom comme ForeignKeyConstraintName de sys.foreign_keys
 
 
Désactivez la contrainte de clé étrangère en utilisant l'instruction ci-dessous
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
J'ai utilisé l'instruction ci-dessous pour désactiver la contrainte de clé étrangère sur la table dbo.Orders.
 --Désactiver la clé Foregin en utilisant NOCHECKALTER TABLE dbo.OrdersNOCHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E--Exécuter les instructions de mise à jour update dbo.Customer set Customerid=100 update dbo.Orders set Customer_Id=100
Activer la contrainte de clé étrangère SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

J'exécute le script ci-dessous pour activer la contrainte de clé étrangère sur la table dbo.Orders.
--Activer la contrainte de clé étrangère à l'aide de CHECKALTER TABLE dbo.OrdersCHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Démonstration vidéo :L'instruction UPDATE est en conflit avec la contrainte REFERENCE