Bayangkan Anda memiliki tabel sederhana:
name | is_active
----------------
A | 0
A | 0
B | 0
C | 1
... | ...
Saya perlu membuat batasan unik khusus yang gagal pada situasi berikut: is_active
nilai yang berbeda tidak dapat hidup berdampingan untuk nilai yang sama name
.
Contoh kondisi yang diizinkan:
Catatan: indeks unik multi-kolom sederhana tidak akan mengizinkan kombinasi seperti ini.
A | 0
A | 0
B | 0
Contoh kondisi yang diizinkan:
A | 0
B | 1
Contoh kondisi gagal:
A | 0
A | 1
-- should be prevented, because `A 0` exists
-- same name, but different `is_active`
Idealnya, saya perlu batasan unik atau indeks parsial unik. Pemicu lebih bermasalah bagi saya.
Ganda A,0
diizinkan, tetapi (A,0) (A,1)
tidak.
postgresql
exclusion-constraint
Andrii Skaliuk
sumber
sumber
ERROR: data type boolean has no default operator class for access method "gist"
int
dansmallint
.EXCLUDE USING gist (name WITH =, (is_active::int) WITH <>)
jika itu boolean. Dan pertanyaannya adalah0
dan1
, tidaktrue
danfalse
jadi agak tidak mungkin saya diuji dengan boolean;)Ini bukan kasus di mana Anda dapat menggunakan indeks unik. Anda dapat menguji kondisi di pemicu, misalnya:
Uji di sini.
sumber