CREATE UNIQUE INDEX OnlyOneUnkownBrand
ON product (CASE WHEN brand = 'unknown' THEN brand END)
EXCLUDE NULL KEYS;
MySQL 不支持部分索引但支持计算列(MariaDB 从 5.3 版本开始,而 MySQL 最近才在 5.7 中)。使用那个可以模拟部分索引:
ALTER TABLE product
ADD COLUMN UnknownBrand AS
(CASE WHEN brand = 'unknown' THEN brand END) PERSISTED,
ADD UNIQUE INDEX OnlyOneUnkownBrand
(UnknownBrand) ;
一些 DBMS 支持带 WHERE 条件的索引
SQL Server 和 PostgreSQL 支持可以定义的部分(过滤的)索引(如 dnoeth 的回答)并且可以是
UNIQUE
:在 Oracle 中,您可以使用表达式的索引实现类似的功能:
对于具有不同品牌的行,表达式的值为
NULL
。在旧版本的 Oracle 中,空值甚至不存储在单列索引中,所以你有一个部分索引!在 DB2(LUV 10.5 及更高版本)中,语法几乎与 Oracle 相同,但我们可以排除
NULL
值,因此索引实际上只存储我们需要的值:MySQL 不支持部分索引但支持计算列(MariaDB 从 5.3 版本开始,而 MySQL 最近才在 5.7 中)。使用那个可以模拟部分索引: