假設我有以下結構的表:正確的方式來實現子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