Puede usar una restricción de exclusión que solo requiere un único índice:
alter table transaction_links
add constraint check_tx
exclude using gist ( (array[send_id, receive_id]) with &&);
El &&
operador es el operador de "superposición" para matrices, lo que significa "tener elementos en común, independientemente del orden de los elementos en la matriz. En este caso, la restricción impide insertar cualquier fila donde cualquier valor de (send_id, receive_id)
aparece en alguna otra fila de la tabla (independientemente de la columna).
Sin embargo, necesita el intarray extensión para eso.
Ejemplo en línea:https://rextester.com/QOYS23482