我有 2 张桌子:1. 员工 2. 凭证
雇员表有一个主键。Vouchers 表有 3 个引用Employees 表的外键约束。
以下是用于在 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.
我不知道这里有什么有效的解决方案。对关系的要求是:每当删除 Employee 时,将其某些列引用到 Employee 的 Voucher 不会被删除(ON DELETE CASCADE 不是一个选项)。相反,引用到已删除员工的列(IssuedBy、ReceivedBy 和/或 ApprovedBy)的值应设置为 NULL(因为这些列是 NULLABLE)。
非常感谢!