シナリオ:
あなたは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制約と競合しました