共享的 SQL 规则/约束

标签 sql postgresql

我有一个包含列的表格:

device_id
account_id
is_owner

以 device_id 和帐户 id 作为联合主键

我如何创建一个 SQL 规则/约束,以便当 is_owner 与联合主键为真时,它将不允许其他组合

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

可以是“很多”,因为所有者帐户可以将设备共享给另一个帐户?

最佳答案

你可以使用部分索引:

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.

关于共享的 SQL 规则/约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49434995/

相关文章:

java - 为什么打印 [[Ljava.lang.Object;@12f29d9, [Ljava.lang.Object;@1648f32]

sql - 触发插入旧值-已更新的值

sql - Postgres : JOIN with first non-null value that matches?

postgresql - 使用带有转义字符的 ilike any()

java - eclipse中的SQL更新语句将更新数据库但会抛出SQL异常

mysql - 根据相互喜欢连接MySQL中的两个表

PHP MySQL 只更新一个单元格,而不是整行

c# - 删除表时 ExecuteNonQuery 会返回什么?

postgresql - PostgreSQL 中是否可以使用并行 SELECT 语句?

java - 在Java中获取没有时区的时间