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