2 つのテーブルがあります: 1. 従業員 2. バウチャー
Employees テーブルには 1 つの主キーがあります。Vouchers テーブルには、Employees テーブルを参照する 3 つの外部キー制約があります。
以下は、SQL Server でテーブルとそれらのリレーションシップの両方を作成するサンプル T-SQL スクリプト (実際のテーブル スクリプトではありません) です。
IF OBJECT_ID('dbo.Vouchers') IS NOT NULL
DROP TABLE dbo.Vouchers
IF OBJECT_ID('dbo.Employees') IS NOT NULL
DROP TABLE dbo.Employees
GO
CREATE TABLE Employees
(
ObjectID INT NOT NULL PRIMARY KEY IDENTITY
)
CREATE TABLE Vouchers
(
ObjectID INT NOT NULL PRIMARY KEY IDENTITY,
IssuedBy INT,
ReceivedBy INT,
ApprovedBy INT,
CONSTRAINT fk_Vouchers_Employees_IssuedBy FOREIGN KEY (IssuedBy)
REFERENCES Employees (ObjectID)
ON UPDATE CASCADE
ON DELETE NO ACTION,
CONSTRAINT fk_Vouchers_Employees_ReceivedBy FOREIGN KEY (ReceivedBy)
REFERENCES Employees (ObjectID)
ON UPDATE CASCADE
ON DELETE NO ACTION,
CONSTRAINT fk_Vouchers_Employees_ApprovedBy FOREIGN KEY (ApprovedBy)
REFERENCES Employees (ObjectID)
ON UPDATE CASCADE
ON DELETE NO ACTION
)
しかし、エラーがスローされます:
Msg 1785, Level 16, State 0, Line 7
Introducing FOREIGN KEY constraint 'fk_Vouchers_Employees_ReceivedBy' on table 'Vouchers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
ここで利用できる効率的なソリューションについてはわかりません。リレーションシップの要件は次のとおりです。従業員が削除されるたびに、従業員への列の一部を参照するバウチャーは削除されません (ON DELETE CASCADE はオプションではありません)。代わりに、削除された従業員を参照する列 (IssuedBy、ReceivedBy、および/または ApprovedBy) の値を NULL に設定する必要があります (列が NULLABLE であるため)。
どうもありがとう!