sql - 基于列值的Oracle唯一约束

标签 sql oracle constraints

我有以下独特的约束

dup_Checklist_QNum UNIQUE (QUESTION_NO, IS_ACTIVE)

我正在尝试防止两个问题处于 Activity 状态时具有相同的问题编号(IS_ACTIVE值= 1)。

一切似乎都很好,直到我第二次不得不提一个问题。
QUESTION_NO=1, TEXT="Have you..", REV=1, IS_ACTIVE=0  
QUESTION_NO=1, TEXT="Have you..", REV=2, IS_ACTIVE=0  <-- This should be ok but constraint was violated
QUESTION_NO=1, TEXT="Have you..", REV=3, IS_ACTIVE=1
QUESTION_NO=1, TEXT="Have you..", REV=3, IS_ACTIVE=1 <-- This should be throw constraint exception 

我需要仅在IS_ACTIVE = 1时应用约束

最佳答案

您可以创建一个基于函数的唯一索引

CREATE UNIQUE INDEX idx_dup_active
    ON <<table name>>( CASE WHEN is_active = 1
                            THEN question_no
                            ELSE NULL
                        END );

这利用了以下事实:Oracle b树索引不存储数据,而叶块数据将完全为NULL。

关于sql - 基于列值的Oracle唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335899/

相关文章:

mysql - 使用 mysql 命令行客户端选择时如何查看数据中的空格

java - java中mysql的语法错误

ios - 如何从代码更改纵横比约束值?

sql - 向超过 16 列的唯一行添加约束

oracle - Web界面编程环境可替代基于Delphi的旧系统

neo4j - 在 Neo4j 中,我可以强制执行关系+节点值约束吗?

sql - 如何在 MS SQL 中的 CASE 条件中编写选择查询

SQL JOIN AND OR 条件

mysql - 如果在另一个表中找到记录,则从表中选择

java - 有没有办法检查一个列在java中是否是虚拟的?