唯一約束和索引都用於確保資料庫表中資料的唯一性。但是,這兩種方法之間存在一些關鍵差異。
唯一約束
CONSTRAINT
關鍵字在表格定義中明確定義。 索引
CREATE INDEX
語句建立。 根據 Postgres 文檔,使用 ALTER TABLE ... ADD CONSTRAINT
是向表格新增唯一約束的首選方法。這是因為專門為強制唯一性而創建唯一索引被認為是實作細節,不應直接存取。
效能:通常,唯一約束和唯一索引在查詢速度方面的效能相似。但是,部分索引可以提高僅存取資料子集的查詢的效能。
外鍵:唯一限制可以被外鍵引用,而唯一索引則不能。
約束開銷:與唯一索引相比,唯一約束略有開銷,因為在插入或更新資料時,它們需要額外的維護操作。
為了說明唯一約束和索引之間的區別,讓我們建立一個同時具有唯一約束和唯一索引的表:
<code class="language-sql">CREATE TABLE foo ( id SERIAL PRIMARY KEY, code INTEGER, label TEXT, CONSTRAINT foo_uq UNIQUE (code, label) ); CREATE UNIQUE INDEX foo_idx ON foo (code, label);</code>
唯一約束 (foo_uq) 和唯一索引 (foo_idx) 都將強制執行 (code, label) 組合的唯一性。但是,您應該優先使用唯一約束,因為它是 Postgres 中推薦的方法。
部分索引
要建立部分索引,請在 CREATE INDEX
語句中使用 WHERE
子句:
<code class="language-sql">CREATE UNIQUE INDEX foo_partial_idx ON foo (code) WHERE label IS NOT NULL;</code>
此索引僅套用於 label
不為 NULL
的行。
使用索引新增約束
您不能使用部分索引來新增唯一約束。但是,您可以使用現有唯一索引建立唯一約束:
<code class="language-sql">ALTER TABLE foo ADD CONSTRAINT foo_partial_uq UNIQUE USING INDEX foo_partial_idx;</code>
以上是Postgres 唯一約束與索引:什麼時候該使用哪一個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!