Możesz użyć ograniczenia wykluczenia który wymaga tylko jednego indeksu:
alter table transaction_links
add constraint check_tx
exclude using gist ( (array[send_id, receive_id]) with &&);
&&
operator jest operatorem "overlaps" dla tablic - co oznacza "mają elementy wspólne, niezależnie od kolejności elementów w tablicy. W tym przypadku ograniczenie uniemożliwia wstawienie dowolnego wiersza, w którym dowolna wartość (send_id, receive_id)
pojawia się w innym wierszu tabeli (niezależnie od kolumny).
Potrzebujesz jednak intarray rozszerzenie do tego.
Przykład online:https://rextester.com/QOYS23482