Sql 将数据约束写入表
我想向表中添加一些东西(触发器?),以便每个ID正好有一行具有特定列的特定值。因此,如果运行的语句使情况并非如此,则会引发异常并回滚插入 让我们以这个模式为例Sql 将数据约束写入表,sql,oracle,triggers,Sql,Oracle,Triggers,我想向表中添加一些东西(触发器?),以便每个ID正好有一行具有特定列的特定值。因此,如果运行的语句使情况并非如此,则会引发异常并回滚插入 让我们以这个模式为例 ID Current Value 1 Y 0 1 N 0 1 N 2 2 Y 2 我想要的约束是,对于每个ID,正好有一行的电流为“Y” 因此,不会执行这些语句并返回适当的错误: insert into table val
ID Current Value
1 Y 0
1 N 0
1 N 2
2 Y 2
我想要的约束是,对于每个ID,正好有一行的电流为“Y”
因此,不会执行这些语句并返回适当的错误:
insert into table values (1,'Y',1);
insert into table values (3,'N',2);
update table set current = 'N' where ID = 1;
我有两个问题:
我认为你所寻找的只是一个独特的约束。 您可以使用下面的语句添加它,以便表中只能存在ID、Current的唯一组合
ALTER TABLE table_name add CONSTRAINT constraint_name UNIQUE (ID,Current);
最好是以声明方式指定它(而不是按程序指定,例如使用触发器)。特别是因为没有某种锁定算法的触发器,由于并发会话试图同时插入/更新表,因此无论如何都无法工作 在这种情况下,最简单的解决方案是基于函数的唯一索引,例如:
CREATE UNIQUE INDEX only_one_current ON thetable
(CASE WHEN Current = 'Y' THEN ID END);
如果Current='N',则表达式为NULL,并且索引中的所有空行均未存储,这意味着唯一性约束仅适用于当前值为“Y”的行。-1 OP希望允许多行具有相同ID且当前值为“N”的行。@Jeffery:-每个ID正好有一行具有特定列的特定值-->这意味着什么???请注意,在问题中,他有两行ID=1,但是Current=N。这些行应该是允许的,但是您的约束将不允许它们。谢谢,这确实看起来正是我想要的!我不懂这个语法,但我会玩这个,等我确认后再回来接受答案。@Jeremy,把它想象成任何其他索引-普通索引类似于
CREATE UNIQUE index index\u name ON table\u name(column\u name)
。在本例中,我用一个将非当前行映射为NULL的表达式替换了column\u name
。