[英]Postgresql: Unique constraint over Union of 2 columns
我有以下表格:
交易
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)都应该被拒绝。另外,在我的设计中,事务表包含的列比这里显示的列多很多,为了简单起见,我只包含了数量。
您可以使用仅需要单个索引的排除约束 :
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.