Buat UNIQUE indeks multikolom pada (product_id, variant_id) :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Namun, ini akan memungkinkan beberapa entri (1, NULL) untuk (product_id, variant_id) karena NULL nilai tidak dianggap sama.
Untuk menebusnya, buat tambahan UNIQUE sebagian indeks di product_id :
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
Dengan cara ini Anda dapat memasukkan (1,2) , (1,3) dan (1, NULL) , tapi tak satu pun dari mereka untuk kedua kalinya. Juga mempercepat kueri dengan ketentuan pada satu atau kedua kolom.
Baru-baru ini, jawaban terkait di dba.SE, hampir secara langsung berlaku untuk kasus Anda:
- Batasan unik multi-kolom PostgreSQL dan nilai NULL