鑑於這樣一個簡化的表結構:如何保證原子SQL插入子查詢?
CREATE TABLE t1 (
id INT,
num INT,
CONSTRAINT t1_pk
PRIMARY KEY (id),
CONSTRAINT t1_uk
UNIQUE (id, num)
)
我可以使用這樣一個子查詢插入記錄,而不會造成競爭狀態?
INSERT INTO t1 (
id,
num
) VALUES (
1,
(
SELECT MAX(num) + 1
FROM t1
)
)
還是子查詢不是原子的嗎?我擔心同步INSERT
會抓取相同的值num
,然後導致違反唯一約束。
而在一個不相關的音符,沒有人知道爲什麼那麼拒絕任何問題與短語爲「CREATE TABLE」?只是給了我一個錯誤... – FtDRbwLXw6
是的,這將導致競爭條件,你可以嘗試做的是使用序列通過使用seq.nextval生成數字,這將返回每個插入的唯一編號。 –
有沒有理由不想在這裏使用序列? –