SQL Server 有一个带有可选唯一列的怪癖:一个表中不能有多个null
列。
例如:
create table employees (
id int identity(1,1) primary key,
givenname nvarchar(24) not null,
familyname varchar(24) not null,
tfn char(9) unique -- optional, but unique
);
(在澳大利亚,我们有纳税人独有的税号)。
以下是一种解决方法:
create table employees (
id int identity(1,1) primary key,
givenname nvarchar(24) not null,
familyname varchar(24) not null,
tfn char(9)
);
CREATE UNIQUE NONCLUSTERED INDEX uq_employees_tfn ON employees(tfn)
WHERE tfn IS NOT NULL;
是否可以命名一个唯一约束并给它上面的条件是类似于第一个例子的方式?也就是说,是否可以在列定义中包含更复杂的约束?
是的,以下工作(仅在 SQL Server 2016 及更高版本中):
内联语法产生与分离的相同的唯一过滤索引
CREATE UNIQUE INDEX
。后续的 DDL 将需要像索引而不是约束一样管理它。CREATE TABLE
它在文档中不是很清楚,但在示例 S 中进行了说明。Paul White 的回答非常适合支持过滤索引的 SQL Server 版本和其他 RDBMS。对于其他数据库系统,解决此问题的一个好方法是拥有一个单独的子表来包含唯一但可选的列。
这些表将处于可选的 1:1 关系(即 1:0-1)中。子表如下所示:
您还可以定义一个外部连接的视图,
tfns
以便employees
一起显示两个表的所有列。