我有下表:
交易
id | amount
------------------
1 | 100
2 | -100
3 | 250
4 | -250
TRANSACTION_LINKS
id | send_tx | receive_tx
---------------------------
1 | 2 | 1
2 | 4 | 2
交易链接表中的send_tx
和receive_tx
列使用指向交易表ID的外键。
这就是我创建交易链接表的方式
CREATE TABLE IF NOT EXISTS transaction_links
(
id BIGSERIAL PRIMARY KEY,
send_id INT NOT NULL UNIQUE REFERENCES transactions(id) ON DELETE
RESTRICT,
receive_id INT NOT NULL UNIQUE REFERENCES transactions(id) ON DELETE
RESTRICT
);
我想在send_tx
和receive_tx
上创建唯一约束,这意味着如果在receive_tx column
中找到了交易ID 1,那么
receiving_tx
= 1 sending_tx
= 1 我知道我可以在每列上分别设置唯一约束,但这只能解决我的第一个问题
编辑:
本质上,如果我将(1,2)插入交易链接,则应该全部拒绝(1,3)或(3,1)或(4,2)或(2,4) 另外,在我的设计中,transactions表包含的列数比此处显示的要多,为简单起见,我仅包括了该数。
答案 0 :(得分:3)
您可以使用exclusion constraint,它只需要一个索引:
alter table transaction_links
add constraint check_tx
exclude using gist ( (array[send_id, receive_id]) with &&);
&&
运算符是数组的“重叠”运算符-表示“具有相同的元素,而与数组中元素的顺序无关。在这种情况下,约束阻止在任何行插入任何行值(send_id, receive_id)
出现在表的其他行中(与列无关)。
但是,您需要使用intarray扩展名。