Postgresql
限制兩個特定列值同時存在
我有一個 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';