用于共享的SQL规则/约束

时间:2018-03-22 17:31:08

标签: sql postgresql

我有一个包含列的表:

device_id
account_id
is_owner

将device_id和帐户ID作为联合主键

如何创建SQL规则/约束,以便当使用集合主键的is_owner为true时,它将不允许另一个组合

device_id = (specific device id)
account_id = (any account id) 
is_owner = true

因为设备的所有者应该只有一个,

那:

device_id  = (specific device id)
account_id = (any account id)   
is_owner = false

可以是很多'由于设备可以由所有者帐户共享到另一个帐户吗?

1 个答案:

答案 0 :(得分:1)

您可以使用部分索引:

CREATE UNIQUE INDEX idx_name 
   ON table_name(device_id, account_id)       --or only (device_id) if needed
WHERE is_owner = true;

<强> DBFiddle Demo

示例:

CREATE TABLE t(device_id INT NOT NULL, account_id INT NOT NULL, is_owner BOOL);
CREATE UNIQUE INDEX idx_name ON t(device_id, account_id)
WHERE is_owner = true;
INSERT INTO t(device_id, account_id, is_owner)
VALUES( 1,1, false),(1,1,false);

SELECT * FROM t;

INSERT INTO t(device_id, account_id, is_owner)
VALUES( 1,2, true),(1,2,true);
--ERROR:  duplicate key value violates unique constraint "idx_name"
--DETAIL:  Key (device_id, account_id)=(1, 2) already exists.