首页 > 解决方案 > 让 SQL Server 明白没有循环

问题描述

我有 2 个表,一个简单的测试,代表我的实际应用程序需要的一个真实用例。我尽可能简单地找出合适的解决方案。

这两个表通过外键链接,其中第二个表关联了第一个表中声明的对象的 2 个实例。

这是创建它们的 SQL Server 命令

DROP TABLE IF EXISTS [dbo].[test_cycles2]
DROP TABLE IF EXISTS [dbo].[test_cycles1]

CREATE TABLE [dbo].[test_cycles1](
  [id_cycle] [int] IDENTITY(1,1) NOT NULL,
  [name] [varchar](100) NULL
  PRIMARY KEY([id_cycle])
)

INSERT INTO [dbo].[test_cycles1] (name) VALUES ('A'), ('B'), ('C'), ('D');


CREATE TABLE [dbo].[test_cycles2](
  [id_cycle1] [int] NOT NULL,
  [id_cycle2] [int] NOT NULL
PRIMARY KEY ([id_cycle1],[id_cycle2]),
CONSTRAINT c_unique CHECK ([id_cycle1] <> [id_cycle2]),
CONSTRAINT fk_cycles2_1 FOREIGN KEY (id_cycle1) REFERENCES [dbo].[test_cycles1] (id_cycle) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_cycles2_2 FOREIGN KEY (id_cycle2) REFERENCES [dbo].[test_cycles1] (id_cycle) ON DELETE CASCADE ON UPDATE CASCADE
)

INSERT INTO [dbo].[test_cycles2] VALUES (1,2), (1,3), (2,4);

SELECT * FROM test_cycles1;
SELECT * FROM test_cycles2;

DELETE FROM test_cycles1 WHERE name = 'A';

SELECT * FROM test_cycles1;
SELECT * FROM test_cycles2;

如您所见,使用我所做的插入,例如:

表 [test_cycles2] 正在链接对象“A”和对象“B”-->(插入值 1,2)。

显然,如果我从 [test_cycles1] 中删除“A”或“B”并不重要,在这两种情况下,[test_cycles2] 都需要在级联时删除,因为“A”将不再链接到“B”。

我了解 SQL Server 告诉我可能存在一个循环(我试图通过检查“A”无法链接到“A”的约束来防止这种情况发生)

约束 c_unique CHECK ([id_cycle1] <> [id_cycle2])

我认为唯一可行的解​​决方案是创建触发器并为我完成这项工作。但是,我想知道它是否真的是正确的解决方案?有没有办法告诉 SQL Server不会有循环,因为它们永远不会在两列中共享同一个对象?

标签: sql-servertriggerscascadedatabase-triggercascading-deletes

解决方案


推荐阅读