1

如果我有一个像这样的轮胎表的 Postgresql 数据库模式(用户有很多轮胎):

user_id integer
description text
size integer
color text
created_at timestamp

我想强制执行“用户只能有 4 个轮胎”的约束。

实现这一点的一种天真的方法是:

SELECT COUNT(*) FROM tires WHERE user_id='123'

,将结果与 4 进行比较,如果它低于 4,则插入。这可能是竞争条件,因此是一种幼稚的方法。

我不想添加计数列。我怎样才能使用排除约束来做到这一点(或者我可以做到这一点)?如果排除约束不可能,那么规范的方法是什么?

4

1 回答 1

0

“正确”的方法是在这里使用锁。首先,您需要锁定相关行。其次,如果用户的轮胎少于 4 个,则插入新记录。这是SQL:

begin;

-- lock rows
select count(*)
from tires
where user_id = 123
for update;

-- throw an error of there are more than 3

-- insert new row
insert into tires (user_id, description)
values (123, 'tire123');

commit;

您可以在此处阅读更多内容如何根据​​行数执行条件插入?

于 2020-03-06T06:04:33.077 回答