唯一约束,但仅当不为null时

时间:2015-03-20 16:33:24

标签: sql sqlite database-design constraints unique

是否可以创建一个仅在colum不为NULL时生效的唯一约束?

这是一个示例表:

CREATE TABLE tbl(
  col1 TEXT,
  col2 TEXT,
  col3 TEXT,
  UNIQUE(col1, col2, col3)
);

所以如果col2为NULL,我希望它被视为[col1, anything, col3]

2 个答案:

答案 0 :(得分:2)

正如SQLite documentation所解释的那样,这是该和许多其他数据库的默认行为:

  

如果在UNIQUECREATE之间显示INDEX关键字,则重复   不允许使用索引条目。任何插入重复条目的尝试   会导致错误。出于唯一索引的目的,所有NULL   值被认为与所有其他NULL值不同   因此独特。这是对此的两种可能解释之一   SQL-92标准(标准中的语言含糊不清)并且是   解释后跟PostgreSQL,MySQL,Firebird和Oracle。   Informix和Microsoft SQL Server遵循其他解释   标准。

因此,您可以根据需要创建索引。

答案 1 :(得分:0)

我不知道sqlite的答案。有几种DBMS产品,这正是默认产品。如果定义了UNIQUE约束,它仍然允许一个或多个具有一个或多个相关列的条目为NULL。

我不确定,但我认为有一些DBMS产品出现了相反的方式。它们不允许具有NULL值的条目,除非可以使用非null值证明唯一性。这个想法是,当存在NULLS时,is_unique的答案可能是未知的。