现场条件约束

时间:2019-09-12 13:54:44

标签: oracle

我有一个包含两列的“ TEST”表,如下所示:

create table TEST (
SEQ_NUM NUMBER NOT NULL,
SWITCH VARCHAR2(1))

switch列从应用程序接收输入为0或1。 对于特定的SEQ_NUM值,我们可以具有任意数量的行,其中Switch值为0。 但是对于特定的SEQ_NUM值,我们只能有一个SWITCH值为1的记录。

我尝试创建这样的约束,但是它抛出语法错误:

CREATE UNIQUE INDEX EMP_INDEX
ON TEST(
(CASE
     WHEN SWITCH = 1
         THEN UNIQUE (SEQ_NUM)        
     ELSE
         NULL
 END));

更清楚地说,输出应如下所示:

  

SQL>插入TEST(SEQ_NUM,SWITCH)值(3,0);
  SQL>已创建1行。

     

SQL>插入TEST(SEQ_NUM,SWITCH)值(3,0);
  SQL>已创建1行。


  

SQL>插入TEST(SEQ_NUM,SWITCH)值(3,1);
  SQL>已创建1行。

     

SQL>插入TEST(SEQ_NUM,SWITCH)值(3,1);

     

ORA错误:查询插入失败,并出现xyz错误----如果我第二次插入,查询应该抛出错误。

1 个答案:

答案 0 :(得分:3)

从CASE表达式中删除UNIQUE

CREATE UNIQUE INDEX EMP_INDEX
  ON TEST(CASE WHEN SWITCH = 1 THEN SEQ_NUM ELSE NULL END);

在线示例:https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=d3ac889aa5127bb2511cb4db611f4981