使用更新/删除级联创建两个外键约束

时间:2021-02-23 07:35:27

标签: sql sql-server foreign-keys ssms check-constraints

数据库示例(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 约束。 无法创建约束或索引。查看以前的错误。

1 个答案:

答案 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
相关问题