Database-Engine

是否有支持“特定值重複限制”的sql數據庫引擎?

  • March 8, 2016

例如,在產品數據庫的品牌列中,品牌價值“未知”應該只存在一次,而其他品牌價值可以存在多次。

有支持它的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) ;

引用自:https://dba.stackexchange.com/questions/131548