0
A
回答
5
當您更新主鍵:
- 支持索引更新。
- 如果是外鍵,則會檢查兒童的 。
但是,如果你做一個刪除和一個插入,刪除這兩個點都被執行,並且插入索引被更新。所以沒有增益做刪除和插入。或者我沒有意識到。
不久之後,做兩次操作而不是一次操作更糟。不包括那個刪除是最難的操作。
1
最大的表現和併發的影響是當你沒有索引子表FKs。在這種情況下,Oracle沒有其他選擇,然後鎖定整個子表進行掃描以驗證參照完整性。
也許這不知何故混淆UPDATE與DELETE/INSERT的主鍵。也許是因爲Oracle支持CASCADE ON DELETE
,但不支持UPDATE
。
當你需要更新時,不要使用delete + insert。
3
雖然我堅信你應該設計你的物理模型,以便外鍵是as stable as possible,但有時你真的需要更新一組鍵,例如由於重組。
我們來比較簡單更新和刪除+插入主鍵之間的數據邊。我們將假設不存在外鍵,也沒有表上的其它索引你的表是作爲一個堆(默認)和現在:
簡單的更新
- 數據修改後的:表格的行數據將直接在塊中修改。主鍵列通常很小,所以行不太可能被遷移。主鍵索引作爲一個普通索引:一個更新鍵會使項指向舊密鑰被刪除,而新的條目指向新的值將被插入。
- 重做條目:重做用於更新將包含在數據操作的物理變化:單個列更新(小重做)和索引刪除+插入件。
- 撤消條目:撤消將包含舊列值(小撤消)和反向插入+索引的刪除。
刪除+插入改性
- 數據(重做):甲骨文將必須物理地刪除該行並插入另一行。從直接數據的角度來看,刪除行是一個簡單的操作:包含該行的塊位於該行,並且該行被標記爲已刪除。如果該塊仍包含足夠數量的數據(其他未刪除的行),則它將保持原樣。如果不是(低於段的
PCTUSED
值),它將被添加到符合插入條件的塊列表中。由於需要記錄所有列的值,插入會導致更多的重做。當然,刪除舊行並插入新行將導致刪除舊索引條目並創建新索引條目(與上面相同)。 - 撤消條目:刪除操作需要記錄舊行的所有列的值。另一方面,插入作爲簡單刪除被撤消保護。
- 數據(重做):甲骨文將必須物理地刪除該行並插入另一行。從直接數據的角度來看,刪除行是一個簡單的操作:包含該行的塊位於該行,並且該行被標記爲已刪除。如果該塊仍包含足夠數量的數據(其他未刪除的行),則它將保持原樣。如果不是(低於段的
如果表中還有其他的指標,它會更糟,因爲每個索引將需要維持一個刪除+插入(而它們保持不變通過主鍵更新,除非列重疊) 。
如果有引用此表的鍵,那麼在兩種情況下都會遇到引用問題。如果表引用了其他表,那麼再次使用delete + insert時會有更多工作(除非引用基於主鍵列,在這種情況下它或多或少會相同)。
結論:由於插入+刪除影響了基表中的所有列,就會造成比簡單的更新更多的工作:更撤消,所有指標更重做和兩個操作(而不是主關鍵指標)。
如果您的表是按索引組織的,則工作量或多或少會相同,因爲該行將在物理上移動,但我確信單個更新仍然會比兩個單一操作更高效(因爲每個操作都涉及開銷)。
相關問題
- 1. Mysql主鍵刪除和重新插入
- 2. 刪除並插入相同的主鍵代替更新
- 3. 插入PDO與主鍵
- 4. 根據主鍵插入或更新
- 5. 刪除主鍵也刪除外鍵
- 6. 更新主鍵
- 7. 插入主鍵時插入外鍵?
- 8. 插入自主鍵
- 9. DataGridView插入主鍵
- 10. TransactionScope主鍵插入,然後外鍵插入 - >插入2主鍵行
- 11. 外鍵不主鍵更新?
- 12. SQL刪除更新外鍵主鍵約束
- 13. 主鍵與鍵
- 14. 刪除並重新創建主鍵
- 15. 同步框架 - 無法更新或刪除主鍵表。只能插入工作
- 16. 蜂巢刪除與複合主鍵
- 17. 刪除mysql中的主鍵
- 18. 無法刪除主鍵表
- 19. 刪除行的主鍵
- 20. 刪除所有主鍵
- 21. Yii2刪除()無主鍵
- 22. 刪除主鍵索引
- 23. 插入表中強制新主鍵
- 24. Mysql的插入與外鍵指主ID
- 25. Android SQLite - 主鍵 - 插入表
- 26. SQLite只插入主鍵
- 27. 從插入獲取主鍵
- 28. 帶主鍵的sqlite插入
- 29. 警報主鍵插入
- 30. 如何插入後,主鍵
我找到了一個很好的鏈接[鏈接](http://stackoverflow.com/questions/3838414/can-we-update-primary-key-values-of-a-table),閱讀Vincent Malgrat給出的答案 –