Database-Engine
是否有支持“特定值重複限制”的sql數據庫引擎?
例如,在產品數據庫的品牌列中,品牌價值“未知”應該只存在一次,而其他品牌價值可以存在多次。
有支持它的sql數據庫引擎嗎?還是我應該在應用層做?
SQL Server 和 PostgreSQL 支持可以定義的部分(過濾)索引(如 dnoeth 的回答),可以是
UNIQUE
:CREATE UNIQUE INDEX OnlyOneUnkownBrand ON product (brand) WHERE brand = 'unknown' ;
在 Oracle 中,您可以使用表達式上的索引來實現類似的功能:
CREATE UNIQUE INDEX OnlyOneUnkownBrand ON product (CASE WHEN brand = 'unknown' THEN brand END) ;
對於具有不同品牌的行,表達式的值為
NULL
。在舊版本的 Oracle 中,空值甚至不儲存在單列索引中,因此您有一個部分索引!在 DB2(LUV 10.5 及更高版本)中,語法幾乎與 Oracle 相同,但我們可以排除
NULL
值,因此索引實際上只儲存我們需要的值:CREATE UNIQUE INDEX OnlyOneUnkownBrand ON product (CASE WHEN brand = 'unknown' THEN brand END) EXCLUDE NULL KEYS;
MySQL 不支持部分索引,但支持計算列(自 5.3 版以來的 MariaDB 和最近在 5.7 中的 MySQL)。使用它可以模擬部分索引:
ALTER TABLE product ADD COLUMN UnknownBrand AS (CASE WHEN brand = 'unknown' THEN brand END) PERSISTED, ADD UNIQUE INDEX OnlyOneUnkownBrand (UnknownBrand) ;