sql-server - 让 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不会有循环,因为它们永远不会在两列中共享同一个对象?
解决方案
推荐阅读
- selenium - 由 Python Selenium 控制的运行 Tor 的最后一个障碍
- python - Python,为什么在使用 unicode 上传文件时会引发 UnicodeEncodeError?
- lua - 在指定位置运行 .exe 或 lua 中的文本
- activiti - 如何提高Activity引擎历史表清理的性能
- html - 如何在不使用任何第三方许可软件的情况下以角度创建/制作基于可移动 SVG 的形状和连接器/线?
- oop - 实现登录注册的UML类图
- if-statement - 为什么与 Excel 中的单元格相比,If 语句的范围行为不同
- javascript - 使用 evaluateJavascript 方法在 Cordova 的 WKWebview 上设置本地图像
- node.js - 如何使用 Socket.io 实时更新 API
- django - 如何在 django 中显示不同项目的总和?