Erstellen Sie einen UNIQUE mehrspaltiger Index auf (product_id, variant_id) :
CREATE UNIQUE INDEX line_items_prod_var_idx ON line_items (product_id, variant_id);
Dies würde jedoch mehrere Einträge von (1, NULL) zulassen für (product_id, variant_id) weil NULL Werte werden nicht als identisch angesehen.
Um dies auszugleichen, erstellen Sie zusätzlich einen partiellen UNIQUE Index auf product_id :
CREATE UNIQUE INDEX line_items_prod_var_null_idx ON line_items (product_id)
WHERE variant_id IS NULL;
Auf diese Weise können Sie (1,2) eingeben , (1,3) und (1, NULL) , aber keiner von ihnen ein zweites Mal. Beschleunigt auch Abfragen mit Bedingungen für eine oder beide Spalten.
Aktuelle, verwandte Antwort auf dba.SE, die fast direkt auf Ihren Fall anwendbar ist:
- PostgreSQL Multi-Column Unique Constraint und NULL-Werte