Postgresql

限制兩個特定列值同時存在

  • August 4, 2014

我有一個 PostgreSQL 範例表,其中最多應該允許不屬於“c”類型的行。

我將不勝感激創建將強制執行此約束的任何幫助。

CREATE TABLE example
(
 example_id    serial PRIMARY KEY,
 example_state CHAR(1) NOT NULL
);

ALTER TABLE example ADD CONSTRAINT 
 example_constraint
CHECK (example_state = 'a' OR example_state = 'b' OR example_state = 'c');

每個稀有類型一排

如果要允許類型為“c”的 0-n 行和類型為“a”和“b”(每個)的行僅 0-1 行,則可以將簡單CHECK約束與部分唯一索引結合起來:

CREATE TABLE example (
 example_id    serial PRIMARY KEY,
 example_state "char" NOT NULL CHECK (example_state IN ('a', 'b', 'c'))
);

CREATE UNIQUE INDEX example_unique_exception_idx ON example (example_state)
WHERE example_state <> 'c'; -- column is not null;

相關答案:

排除約束將是一個相關概念,但它不適用於'c'. 您可以使用NULL而不是 ‘c’ 來完成這項工作。

還要注意特殊的數據類型"char"(雙引號!),這似乎非常適合您的簡單目的(除非它只是為了問題的目的而進行的簡化)。它只佔用一個字節 - 與 相比char(1),它需要至少 2 個字節在磁碟上和 5 個在 RAM 中。

任何稀有類型的單例行

要限制為沒有類型“c”的單行,請在表達式上使用部分唯一索引

CREATE UNIQUE INDEX example_single_exception_idx ON example ((example_state <> 'c'))
WHERE example_state <> 'c';

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