【发布时间】:2022-11-17 01:08:10
【问题描述】:
我想防止使用约束写入数据,但约束很复杂。
我有 3 列:A B C
如果 A & B 匹配现有记录,则记录重复,如果 A & C 匹配现有记录,但 B & C 匹配现有记录是有效的,除非 A=2。
例如。 假设现有记录
A=1,B=2,C=3
如果我插入
A=1,B=2,C=4
我应该得到一个错误
如果我插入
A=1,B=99,C=3
我应该得到一个错误
如果我插入:
A=99,B=2,C=3
那会成功的。
如果我插入:
A=2,B=2,C=3
我应该得到一个错误。
检查必须在 INSERT 时间完成。我不能选择然后插入,因为数据可能在选择和插入之间发生了变化。
想法:
- 如果我将逻辑放在 TRIGGER 中,那行得通吗?我不确定触发器是否是 100% 原子的。
- 交易有效吗?我不想锁定表,因为其他进程会不断插入数据。
- 我可以添加一个或多个约束吗?有没有办法在插入时检查约束?
【问题讨论】:
-
触发器定义的代码在哪里?还请添加您正在使用的表的定义(如 CREATE TABLE ... 语句)。 (像DBFIDDLE这样的东西会让你的问题更容易回答)
-
这是一个非常简化的示例,我无法显示真实的表格。我会尝试 DBFIDDLE。
-
所以最后的要求是如果
A=2那么B&C的组合不能出现任何地方,甚至在哪里A!=2?? -
如果你先
INSERT INTO dbo.YourTable (A,B,C) VALUES(2,2,3);然后INSERT INTO dbo.YourTable (A,B,C) VALUES(12,2,3);可以吗? -
@Larnu 2,2,3 应该失败,但是 12,2,3 应该成功。
标签: sql sql-server