シナリオ:
主外部キーの関係を持たない2つのテーブルdbo.Customerとdbo.Ordersを作成しました。テーブルを作成した後、いくつかのレコードを挿入しました。後で、外部キー制約を追加することになっていることに気づきました。 dbo.Ordersテーブルを変更しようとすると、エラーが発生しました。以下のスクリプトを使用して、dbo.CustomerテーブルとDbo.Orderテーブルを作成します
USE YourDatabaseName GO CREATE 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 )以下のスクリプトを使用してサンプルレコードを挿入します。
INSERT INTO dbo.Customer (CustomerId,FName, LName,SSN) VALUES (1,'Aamir','Shahzad','000-000-00') INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,Customerid) values ('TV',2,2)次に、外部キー制約を追加しましょう
Alter table dbo.Orders Add Constraint Fk_CustomerId Foreign Key(CustomerId) References dbo.Customer(CustomerId)上記のスクリプトを実行すると、以下のエラーが発生します。
Msg 547、レベル16、状態0、行31
ALTERTABLEステートメントがFOREIGNKEY制約「Fk_CustomerId」と競合しました。データベース"YourDatabaseName"、テーブル "dbo.Customer"、列'Customerid'で競合が発生しました。
dbo.CustomerのCustomerId列の値は1であり、dbo.Ordersテーブルの列CustomerIdの値は2です。 。値が一致していません。それが上記のエラーを受け取った理由です。
解決策:
1)2番目のテーブル(dbo.Orders)のデータを修正します 2番目のテーブルのデータを修正し、CustomerId列の値を更新できます。プライマリテーブル(Dbo.Customer.CustomerId)と一致する正しいデータが得られたら、問題なく外部キー制約を作成できます。2)チェックなしでテーブルの変更を使用(既存のデータを無視) ) 既存のデータの関係を気にしない場合。 WITH NoCheck with alter tableステートメントを使用すると、データを検証して外部キー制約を作成するためのチェックが無視されます。外部キー制約が作成されると、挿入された新しいレコードの整合性が強制されます。
Alter table dbo.Orders with Nocheck Add Constraint Fk_CustomerId Foreign Key(CustomerId) References dbo.Customer(CustomerId)
Video Demo