首頁 >資料庫 >mysql教程 >Postgres 唯一約束與索引:什麼時候該使用哪一個?

Postgres 唯一約束與索引:什麼時候該使用哪一個?

Linda Hamilton
Linda Hamilton原創
2025-01-12 07:07:43559瀏覽

Postgres Unique Constraints vs. Indexes: When Should You Use Which?

Postgres 唯一約束與索引

簡介

唯一約束和索引都用於確保資料庫表中資料的唯一性。但是,這兩種方法之間存在一些關鍵差異。

Postgres 中的唯一約束與索引

唯一約束

  • 使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn