Ini sepertinya salah paham.
Kutipan Anda dari jawaban saya agak menyesatkan, karena itu hanya berlaku jika Anda juga membuat indeks parsial tambahan seperti yang dijelaskan di sana:
Cara menambahkan indeks unik bersyarat di PostgreSQL
Jika Anda tidak menambahkan indeks kedua ini (seperti yang tidak Anda lakukan), Anda sudah memiliki solusi , tampaknya. Dengan indeks unik multikolom saja, Anda dapat memasukkan (1, NULL)
beberapa kali, tapi (1,2)
atau (1,3)
hanya sekali.
String kosong
Jika, secara tidak sengaja, Anda mempertimbangkan string kosong (''
) (untuk jenis karakter
) bukannya NULL
nilai:mereka ditangani seperti nilai lainnya. Anda bisa atasi situasi ini menggunakan indeks unik multikolom, sebagian fungsional (indeks pada ekspresi
):
CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));
Dengan cara ini Anda dapat memasukkan (1, 'a')
, (1, 'b')
hanya sekali.
Tapi (1, NULL)
dan (1, '')
beberapa kali.
Efek samping
Indeks masih akan sepenuhnya mendukung kueri biasa pada kolom pertama (tat
).
Tetapi kueri pada kedua kolom harus cocok dengan ekspresi untuk memanfaatkan potensi penuh. Ini akan lebih cepat, meskipun tampaknya tidak masuk akal:
SELECT * FROM predictions
WHERE tat = 1
AND NULLIF(dim, '') = 'foo';
.. dari ini:
SELECT * FROM predictions
WHERE tat = 1
AND dim = 'foo';
.. karena kueri pertama dapat menggunakan kedua kolom indeks. Hasilnya akan sama (kecuali saat mencari ''
atau NULL
). Rincian dalam jawaban terkait ini di dba.SE
.