Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将数据约束写入表_Sql_Oracle_Triggers - Fatal编程技术网

Sql 将数据约束写入表

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正好有一行具有特定列的特定值。因此,如果运行的语句使情况并非如此,则会引发异常并回滚插入

让我们以这个模式为例

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;
我有两个问题:

  • 将这种约束逻辑编码到表中是一个好主意,还是最好为处理数据的应用程序保存这种约束逻辑?为什么?

  • 怎样才能做到呢?oracle提供了什么样的工具来创建这样的约束


  • 我认为你所寻找的只是一个独特的约束。 您可以使用下面的语句添加它,以便表中只能存在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