我有一个包含列的表:
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
可以是很多'由于设备可以由所有者帐户共享到另一个帐户吗?
答案 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.