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

L'instruction ALTER TABLE est en conflit avec la contrainte FOREIGN KEY dans SQL Server - SQL Sever / TSQL Tutorial Part 69

Scénario :

Vous avez créé deux tables dbo.Customer et dbo.Orders sans relation de clé étrangère primaire. Après avoir créé des tables, vous avez inséré quelques enregistrements. Plus tard, vous avez réalisé que vous étiez censé ajouter une contrainte de clé étrangère. Lorsque vous avez essayé de modifier la table dbo.Orders, vous avez reçu une erreur.

Créez les tables dbo.Customer et Dbo.Order en utilisant le script ci-dessous

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, CustomerId int )
 Insérez des exemples d'enregistrements en utilisant le script ci-dessous.

 INSERT INTO dbo.Customer (CustomerId,FName, LName,SSN) VALUES (1,'Aamir','Shahzad','000-000- 00') INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,Customerid) valeurs ('TV',2,2)
 Ajoutons maintenant la contrainte de clé étrangère

 Alter table dbo.Orders Add Constraint Fk_CustomerId Foreign Key(CustomerId) References dbo.Customer(CustomerId)
 
 
 Lorsque nous exécutons le script ci-dessus, nous obtenons l'erreur ci-dessous.

Msg 547, Niveau 16, État 0, Ligne 31
L'instruction ALTER TABLE est en conflit avec la contrainte FOREIGN KEY "Fk_CustomerId". Le conflit s'est produit dans la base de données "YourDatabaseName", table "dbo.Customer", colonne 'Customerid'.

Comme dbo.Customer a la valeur 1 pour la colonne CustomerId et dans la colonne de table dbo.Orders, CustomerId a la valeur 2 . Les valeurs ne correspondent pas entre elles. C'est la raison pour laquelle nous avons reçu l'erreur ci-dessus.

Solution :

1) Corrigez les données dans la deuxième table (dbo.Orders) Nous pouvons corriger les données dans la deuxième table et mettre à jour les valeurs de la colonne CustomerId. Une fois que nous aurons des données correctes qui correspondent à notre table primaire ( Dbo.Customer.CustomerId), cela nous permettra de créer une contrainte de clé étrangère sans aucun problème.
2) Utilisez Alter Table avec Nocheck (ignorez les données existantes ) Si vous ne vous souciez pas de la relation des données existantes. Vous pouvez utiliser With NoCheck avec l'instruction alter table et il ignorera la vérification pour valider les données et créer une contrainte de clé étrangère. Une fois la contrainte de clé étrangère créée, elle renforcera l'intégrité de tous les nouveaux enregistrements insérés.
 Alter table dbo.Orders with Nocheck Add Constraint Fk_CustomerId Foreign Key(CustomerId) References dbo.Customer(CustomerId) 
 
 
 
 
Démo vidéo