【问题标题】:Add constraint unique column with null value添加具有空值的约束唯一列
【发布时间】:2017-07-12 03:02:13
【问题描述】:

我需要创建一个完整性约束,以确保在表的列中只有一个空值。经典的 UNIQUE 不好,因为它没有检测到多个空值...... 我该怎么办?

【问题讨论】:

  • 是否有任何业务逻辑或接口阻止您使用唯一的“无数据”值而不是空值?
  • 问题是它是考试练习的限制,所以我无法做出设计选择

标签: sql oracle constraints unique


【解决方案1】:
CREATE TABLE qwe(
  id int
);

CREATE UNIQUE INDEX qwe_idx ON qwe( 
      CASE WHEN id IS null THEN 'NULL' ELSE to_char(id) END 
);

INSERT INTO qwe VALUES(1);
1 row inserted.

INSERT INTO qwe VALUES(1);
Error starting at line : 9 in command -
INSERT INTO qwe VALUES(1)
Error report -
ORA-00001: naruszono więzy unikatowe (TEST.QWE_IDX)

INSERT INTO qwe VALUES(NULL);
1 row inserted.

INSERT INTO qwe VALUES(NULL);
Error starting at line : 9 in command -
INSERT INTO qwe VALUES(NULL)
Error report -
ORA-00001: naruszono więzy unikatowe (TEST.QWE_IDX)

SELECT * FROM qwe;

        ID
----------
         1
    (null)

【讨论】:

  • 这将适用于像 ID 这样的列,它是 NUMBER 数据类型。如果该列是 VARCHAR2 列,则与字符串“NULL”进行比较可能不起作用,因为这可能是该列中的有效值。但是,一个小的修改将起作用 - 例如,在列值的末尾连接一个空格时创建一个唯一约束。 (如果 Oracle 根据标准处理 NULL,这应该不起作用,但事实并非如此。)
  • @mathguy for string (varchar2) columns 解决方案也很简单,只需:CREATE UNIQUE INDEX on table( CASE WHEN column IS NULL THEN 1 END )
  • 该解决方案不正确:1 将被强制转换为 VARCHAR2,并且它可能与列中的有效值(字符串 '1')发生冲突。我已经在我的评论中描述了一个正确的解决方案(它不依赖于对列中有效和无效值的预先了解)。
  • 另外,你的意思可能是when column is null then 1 ELSE COLUMN end
  • @mathguy - 没有。只需在此(字符串)列上创建普通的唯一约束,此外,创建第二个唯一的功能索引,以防止插入两个空值。
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多