以下のサンプルテーブルのように、他の1つのテーブルを指す複数の外部キーがあり、単一のカスケードが表示されていないテーブルを持つ巨大なレガシーデータベースがあります。
create table Users (
Id int primary key identity,
Name varchar(max)
)
create table Products (
Id int primary key identity,
Name varchar(max),
CreatedBy int foreign key references Users(Id),
UpdatedBy int foreign key references Users(Id)
)
insert into Users values('Bar')
insert into Users values('Baz')
insert into Products values('Foo', 1, 2)
古いデータの一部を削除できるようにする必要がありますが、もちろん参照例外がスローされます。
delete from Users where Name='Bar'
DELETEステートメントがREFERENCE制約「FK__Products__Create__1AD3FDA4」と競合していました。データベース「Foo」、テーブル「dbo.Products」、列「CreatedBy」で競合が発生しました。
データベースが非常に複雑なため、すべての参照を事前に削除することはできません。そのため、カスケードを設定して一時的な外部キーをプログラムで追加しようとしています。ただし、他の1つのテーブルへの複数の外部キーを持つこの特定のテーブルの場合、これcycles or multiple cascade paths
は2番目のUpdatedBy
変更になります。
alter table Products add foreign key (CreatedBy) references Users(Id) on delete cascade
alter table Products add foreign key (UpdatedBy) references Users(Id) on delete cascade
テーブル「Products」にFOREIGNKEY制約「FK__Products__Update__1DB06A4F」を導入すると、サイクルまたは複数のカスケードパスが発生する可能性があります。ON DELETENOACTIONまたはONUPDATENO ACTIONを指定するか、他のFOREIGNKEY制約を変更します。
複数のカスケードパスの問題を回避するなどして、参照整合性を維持しながら作業を行うにはどうすればよいdelete from Users where
ですか?