首頁 >資料庫 >mysql教程 >如何在 Postgres 中使用可空列建立唯一約束?

如何在 Postgres 中使用可空列建立唯一約束?

DDD
DDD原創
2025-01-21 00:12:08258瀏覽

How to Create a Unique Constraint in Postgres with Nullable Columns?

在 PostgreSQL 中處理可空列的唯一限制

本文檔解決了在包含可為空白列的 PostgreSQL 表中強制執行唯一約束的挑戰。 出現此問題的原因是,預設情況下,NULL 值被視為彼此不同。 當可空列保留 NULL 時,這允許多行具有相同的非 NULL 值。 該解決方案旨在建立一個將 NULL 視為等效的唯一限制。

解決問題

目標是建立一個唯一約束,防止基於特定列的重複行,即使可空列包含 NULL 值也是如此。

解決方案

PostgreSQL 15 及更高版本:

PostgreSQL 15 引入了 NULLS NOT DISTINCT 子句,提供了一個簡單的解決方案。此子句確保 NULL 值在唯一約束內被視為相同。 以下命令示範了其用法:

<code class="language-sql">ALTER TABLE favorites
ADD CONSTRAINT favo_uni UNIQUE NULLS NOT DISTINCT (user_id, menu_id, recipe_id);</code>

PostgreSQL 14 及更早版本:

對於較舊的 PostgreSQL 版本,NULLS NOT DISTINCT 子句不可用。 此解決方案需要建立兩個部分唯一索引:

<code class="language-sql">CREATE UNIQUE INDEX favo_3col_uni_idx ON favorites (user_id, menu_id, recipe_id)
WHERE menu_id IS NOT NULL;

CREATE UNIQUE INDEX favo_2col_uni_idx ON favorites (user_id, recipe_id)
WHERE menu_id IS NULL;</code>

這種方法有效地增強了唯一性。第一個索引處理 menu_id 不為 NULL 的情況,而第二個索引處理 menu_id 為 NULL 的情況。 當 (user_id, recipe_id) 為 NULL 時,這可以防止 menu_id 的重複組合。

以上是如何在 Postgres 中使用可空列建立唯一約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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