シナリオ:
主外部キーの関係を持たない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