在努力避免自動序列號等在這個特定的數據庫或那樣的原因,我想知道,如果任何人都可以看到任何問題與此:此INSERT是否可能導致任何鎖定/併發問題?
INSERT INTO user (label, username, password, user_id)
SELECT 'Test', 'test', 'test', COALESCE(MAX(user_id)+1, 1) FROM user;
我使用PostgreSQL(也嘗試作爲數據庫不可知論儘可能)..
編輯: 有兩個原因,我想要做到這一點。
- 保持對任何特定的RDBMS低依賴性。
- 如果數據批量更新到中央數據庫,則無需擔心更新序列。
插入性能不是問題,因爲只需要這些表就可以設置表。
EDIT 2: 我與玩的想法是,數據庫中的每個表都有人產生SITECODE作爲關鍵的一部分,所以我們始終有一個複合鍵。這有效地對SiteCode上的數據進行分區,並允許從特定站點獲取數據並將其放在其他地方(顯然在同一數據庫結構中)。例如,這將允許將各種操作站點備份到一箇中央數據庫上,但也允許該中央數據庫具有使用它的操作站點。 我仍然可以使用序列,但它似乎凌亂。實際的INSERT會看起來更象這樣:
INSERT INTO user (sitecode, label, username, password, user_id)
SELECT 'SITE001', 'Test', 'test', 'test', COALESCE(MAX(user_id)+1, 1)
FROM user
WHERE sitecode='SITE001';
如果是有道理的.. 我以前做過類似的東西,它工作得很好,但是在這種情況下,中央數據庫是從未操作(這是更多的是集中查看數據/分析的方式),所以它不需要生成ID。
編輯-3: 我開始覺得這是簡單的永遠只允許中央數據庫是主動的,或僅備份只,從而完全避免了問題,並允許更簡單設計。
哦,回到繪圖板!
無關的說明:您正在數據庫中存儲明文密碼? – Tomalak 2011-02-05 11:01:28
只有在短期內,至少我現在的擔心。 – Mark 2011-02-05 11:06:14
如果因某種原因不喜歡序列,則可以使用UUID – 2011-02-05 11:31:26