Sql 添加具有空值的约束唯一列

Sql 添加具有空值的约束唯一列,sql,oracle,constraints,unique,Sql,Oracle,Constraints,Unique,我需要创建一个完整性约束,以确保表的列中只有一个null值。经典的UNIQUE不好,因为它不检测多个空值。。。 我该怎么办 CREATE TABLE qwe( id int ); CREATE UNIQUE INDEX qwe_idx ON qwe( CASE WHEN id IS null THEN 'NULL' ELSE to_char(id) END ); 是否有任何业务逻辑或接口阻止您使用唯一的“无数据”值而不是空值?问题是这是一个考试练习的约束,因此

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

CREATE TABLE qwe(
  id int
);

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







是否有任何业务逻辑或接口阻止您使用唯一的“无数据”值而不是空值?问题是这是一个考试练习的约束,因此我无法进行设计选择是否有任何业务逻辑或接口阻止您使用唯一的“无数据”值而不是空值?问题是它是考试的约束练习,因此我无法进行设计选择这将在ID这样的列上工作,ID是数字数据类型。如果该列是VARCHAR2列,则与字符串“NULL”进行比较可能不起作用,因为这可能是该列中的有效值。但是,一个小的修改将起作用-例如,在列值末尾连接一个空格时创建一个唯一的约束。(如果Oracle按照标准处理NULL,这应该不起作用,但事实并非如此。)@mathguy for string(varchar2)columns解决方案也非常简单,只需:
在表上创建唯一索引(列为NULL时为1结尾)
该解决方案不正确:1将被强制转换为VARCHAR2,它可能与列中的有效值(字符串“1”)冲突。在我的评论中,我已经描述了一个正确的解决方案(不依赖于预先了解列中的有效值和无效值)。此外,您可能指的是
当列为null时,则为1 ELSE column end
@mathguy-否。只需在该(字符串)列上创建普通的唯一约束,另外,创建第二个唯一约束,防止插入两个空值的函数索引。这将适用于类似于ID的列,它是数字数据类型。如果该列是VARCHAR2列,则与字符串“NULL”进行比较可能不起作用,因为这可能是该列中的有效值。但是,一个小的修改将起作用-例如,在列值末尾连接一个空格时创建一个唯一的约束。(如果Oracle按照标准处理NULL,这应该不起作用,但事实并非如此。)@mathguy for string(varchar2)columns解决方案也非常简单,只需:
在表上创建唯一索引(列为NULL时为1结尾)
该解决方案不正确:1将被强制转换为VARCHAR2,它可能与列中的有效值(字符串“1”)冲突。在我的评论中,我已经描述了一个正确的解决方案(不依赖于预先了解列中的有效值和无效值)。此外,您可能指的是
当列为null时,则为1 ELSE column end
@mathguy-否。只需在该(字符串)列上创建普通的唯一约束,另外,创建第二个唯一约束,防止插入两个空值的函数索引。
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)