シナリオ:
あなたはSQLServer開発者として働いており、テーブルの1つに更新ステートメントを記述し、以下のエラーが発生しました。Msg 547、レベル16、状態0、行32
UPDATEステートメントがREFERENCE制約"FK_"と競合していました。
データベース"YourDatabaseName"、テーブル "SchemaName.YourTableName"、列'ColumnName'で競合が発生しました。
ステートメントは終了しました。
この問題を解決するにはどうすればよいですか?
解決策:
以下のスクリプトを使用して、最初にこのエラーを作成しましょう。 2つのテーブルdbo.Customerとdbo.Ordersを作成します。テーブルには主キーと外部キーの関係があります。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 ,Customer_id INT FOREIGN KEY REFERENCES Customer(CustomerId) ) --insert sample data insert into dbo.Customer (CustomerId,FName, LName,SSN) values (1,'Aamir','Shahzad','000-000-00') insert into dbo.Orders (OrderItemName,OrderItemAmt,Customer_Id) values ('TV',1,1)
SQLServerで列が外部キー制約によって参照されている場合にレコードを更新する方法 |
ここで、dbo.CustomerのCustomerId値が正しくなく、更新する必要があると感じた場合を考えてみましょう。以下のupdateステートメントを記述して、CustomerIdを100に更新しました。
update dbo.Customer set Customerid=100
以下のエラーが発生します。
メッセージ547、レベル16、状態0、33行目UPDATEステートメントがREFERENCE制約「FK__Orders__Customer__1ED998B2」と競合しました。データベース"YourDatabaseName"、テーブル "dbo.Orders"、列'Customer_id'で競合が発生しました。ステートメントは終了しました。
dbo.OrdersテーブルにCustomer_idvalue =100がないため、更新できません。参照テーブルのレコード。ここで、最初に親テーブル(dbo.Orders)を修正してから、dbo.Customerテーブルを更新できると考えました。
update dbo.Orders set Customer_Id=100ここでも、dbo.Customerテーブルで利用可能なCustomerId =100がないため、次のようなエラーが発生しました。
Msg 547、レベル16、状態0、行36UPDATEステートメントがFOREIGNKEY制約"FK__Orders__Customer__1ED998B2と競合しました"。データベース「YourDatabaseName」、テーブル「dbo.Customer」、列「Customerid」で競合が発生しました。ステートメントは終了しました。
ここから複数のソリューションを利用できます> 1) レコードを更新する代わりに、レコードを参照テーブル(Dbo.Customer)に挿入し、次に親テーブル(Dbo.Orders)のレコードを更新し、最後に既存のレコードを参照テーブルから削除します。
--Insert Record in Reference Table First insert into dbo.Customer (CustomerId,FName, LName,SSN) values (100,'Aamir','Shahzad','000-000-00') --Update the Records in Parent Table update dbo.Orders set Customer_Id=100 --Delete the old record from Reference Table Delete from dbo.Customer where CustomerId=1今すぐテーブルのレコードを確認してください。
SQLServerの外部キー制約によって参照されるときに列値を更新する方法 |
2)外部キー制約を無効にし、値を手動で更新します 別の解決策として、外部キー制約を無効にし、レコードを更新して、最後に外部キーを再度有効にすることができます。
--Find the Foreign Key Constraint with Table Name USE YourDatabaseName GO Select Schema_name(Schema_id) as SchemaName, object_name(Parent_object_id) as TableName, name as ForeignKeyConstraintName from sys.foreign_keys
以下のステートメントを使用して外部キー制約を無効にします
SyntaxALTERTABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
以下のステートメントを使用して、dbo.Ordersテーブルの外部キー制約を無効にしました。
--Disable Foregin Key by using NOCHECK ALTER TABLE dbo.Orders NOCHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E --Run Update Statements update dbo.Customer set Customerid=100 update dbo.Orders set Customer_Id=100を実行します 外部キー制約の有効化SyntaxALTERTABLESchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name
以下のスクリプトを実行して、dbo.Ordersテーブルで外部キー制約を有効にします。
--Enable Foreign Key Constraint by using CHECK ALTER TABLE dbo.Orders CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E
ビデオデモ:UPDATEステートメントがREFERENCE制約と競合しました