oracle - 字段级别的条件约束
问题描述
我有一个包含 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 错误----如果我第二次插入,查询应该抛出错误。
解决方案
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
推荐阅读
- java - 新的 Runnable 导致胶子应用程序崩溃
- c++ - 在 Windows 驱动程序中使用 ZwNotifyChangeKey
- json - XQuery 如何计算 JSON 中的所有“咒语”
- bash - 使用 fzf 从目录中查找并执行程序
- python - Tensorflow-gpu 仅使用 1.14 版本训练自定义对象检测模型
- sql - 使用 spring JdbcTemplate 是否会创建到 sql server 的新连接?
- rust - 使用强制转换的可变访问器是否安全?
- javascript - 多个(2)拖放JQuery
- terminal - 当我尝试安装 Homebrew 时,为什么终端提示要求输入密码?
- java - 在移动设备和可穿戴设备上保存表盘设置