除外制約 を使用できます。 必要なインデックスは1つだけです:
alter table transaction_links
add constraint check_tx
exclude using gist ( (array[send_id, receive_id]) with &&);
&&
演算子は、配列の「オーバーラップ」演算子です。これは、「配列内の要素の順序に関係なく、要素が共通していることを意味します。この場合、制約により、(send_id, receive_id)
(列に関係なく)テーブルの他の行に表示されます。
ただし、intarray が必要です。 そのための拡張機能。
オンラインの例: https://rextester.com/QOYS23482