数据库示例(SQL Server):
Table A
-colA (PK, int)
Table B
-ColB (FK, int) --> points to Table X
Table C
-ColAC (PK, FK, int not null) --> points to Table A
-ColBC (PK, FK, int not null) --> points to Table B
表 C 的主键是 ColAC 和 ColBC。每列都有指向不同表的外键。我需要对表 C 的两个外键都有 ON UPDATE/DELETE CASCADE 约束。因此,当表 A 或 B 发生更改时,它会在表 C 中级联。
表 A 和 B 已在使用中。我可以仅使用其中一个约束创建表 C,但不能同时使用这两个约束,这将返回错误消息。如何创建两个 FK 约束?
SQL 示例:
CREATE TABLE Table_C (
ColAC INT NOT NULL,
ColBC INT NOT NULL,
PRIMARY KEY (
ColAC,
ColBC
)
)
GO
ALTER TABLE Table_C WITH CHECK ADD FOREIGN KEY (ColAC)
REFERENCES Table_A (ColA)
ON UPDATE CASCADE
ON DELETE CASCADE
GO
--The second constraint will always fail (does not matter which one is first).
ALTER TABLE Table_C WITH CHECK ADD FOREIGN KEY (ColBC)
REFERENCES Table_B (ColB)
ON UPDATE CASCADE
ON DELETE CASCADE
GO
错误信息:
<块引用>在表 'Table_C' 上引入 FOREIGN KEY 约束 .... 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束或索引。查看以前的错误。
答案 0 :(得分:0)
你可以选择两个不同的表,而不是一个表C
表 C1 -ColAC (PK, FK, int not null) --> 指向表 A
表 C2 -ColBC (PK, FK, int not null) --> 指向表 B
现在,您可以在这两个表之间使用 UNION ALL
CREATE VIEW vw_TableC
AS
SELECT ColAC, 'TableA' as parent ... FROM TableC1
UNION ALL
SELECT ColBC, 'TableB' as parent ... FROM TableC2