假设我有以下结构的表:正确的方式来实现子ID?
CREATE TABLE test(
id SERIAL,
type VARCHAR(10),
sub_id INTEGER,
UNIQUE (type, sub_id)
)
,我希望“sub_id”栏目是一个特定的“类型”中的计数器。例如:
id | type | sub_id
---------------------
1 | 'foo' | 1
--------------------
2 | 'foo' | 2
--------------------
3 | 'foo' | 3
--------------------
4 | 'bar' | 1
--------------------
5 | 'bar' | 2
要插入新行我想用下面的查询:
INSERT INTO test(type,sub_id)
SELECT 'foo', MAX(sub_id)+1
FROM test
WHERE type='foo'
但后来我发现,这种查询是脆弱的竞争条件。 将子计数器保存在类型中的正确方法是什么?
真的,有可能不涉及表锁不正确的方式,你可以得到的东西这几乎可以通过使用序列来工作,但你已经有了几乎可以工作的东西。行被删除时应该发生什么? – Jasen 2015-01-21 00:44:02