首页 > 解决方案 > 字段级别的条件约束

问题描述

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

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

开关列从应用程序接收输入为 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 错误----如果我第二次插入,查询应该抛出错误。

标签: oracle

解决方案


UNIQUE从 CASE 表达式中删除:

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


推荐阅读