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=100Encore 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=1Vé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=100Activer 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