我有一個這樣的值的表:
...
jack | woo
...
james | poo
james | woo
...
john | poo
...
兩列還有一個 UNIQUE 約束
我想把所有的 'poo' 都改成 'woo',只要不違反約束,然后洗掉剩下的 'poo',以獲得這張表:
...
jack | woo
...
james | woo
...
john | woo
...
我的第一步嘗試很遠:
UPDATE MyTable SET lastname='woo' WHERE lastname='poo'
結果:唯一約束失敗:[..]
UPDATE MyTable SET lastname='woo' WHERE lastname='poo'
AND NOT EXISTS (SELECT 1 FROM MyTable t2 WHERE t2.lastname='woo')
結果:[..] 0 行受影響
這是我在 sqlite-browser 中執行的一個操作,我可能只需要它幾十次左右。所以解決方案不需要非常高效或單一查詢。
由于我的資料庫不是“實時”的,我還可以暫時禁用約束檢查,執行我的第一個查詢,然后清理重復項(如何?)
uj5u.com熱心網友回復:
您應該關聯子查詢:
UPDATE MyTable AS t1
SET lastname = 'woo'
WHERE t1.lastname = 'poo'
AND NOT EXISTS (SELECT 1 FROM MyTable t2 WHERE (t2.firstname, t2.lastname) = (t1.firstname, 'woo'));
然后洗掉剩余的行:
DELETE FROM MyTable WHERE lastname = 'poo';
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/438834.html
