Update

當必須更新行時,數據庫是否會進行刪除和插入?

  • September 14, 2021

所以今天一位教授告訴我們,當數據庫必須進行更新時,在內部(在低級別)它會先刪除,然後再插入更新的欄位。然後他說這是所有數據庫都做的事情,然後我開始討論說我認為這沒有意義,但我沒有足夠的資源來支持我的立場。他似乎知道很多,但我不明白為什麼 dbs 會那樣做。

我的意思是,我知道如果您更新一個欄位並且您需要更多空間來儲存該行,那麼它可能會物理刪除該行並將其放在新數據的末尾。但是,例如,如果您減少使用的空間,為什麼要刪除並在最後重新插入呢?

這是真的嗎?有什麼好處?

這是真的嗎?

不,這是一個實現細節。如果數據庫願意,它可以在適當的位置實施適當的更新。

有什麼好處?

將更新拆分為刪除然後插入通常會使實現更簡單。潛在的附帶好處包括能夠通過對拆分刪除/插入操作進行適當排序來避免唯一索引中的瞬時鍵違規

與真正的就地更新相比,拆分更新可能會慢一些並生成更多日誌(無論如何這並不總是可能的)。

正如 Kin 在評論中指出的那樣,如果您需要一個範例(對於 SQL Server),請參閱:

它也與實現 MVCC 有關。在關於MVCC的維基百科頁面中,提到了:

當 MVCC 數據庫需要更新一項數據時,它不會用新數據覆蓋舊數據,而是將舊數據標記為過時,並在其他地方添加新版本。因此儲存了多個版本,但只有一個是最新的。這允許讀者訪問他們開始閱讀時的數據,即使它被其他人修改或刪除。

另請參閱Bruce Momjian 的PostgreSQL Internals pdf第 60 頁(Postgres 使用 MVCC): UPDATE實際上是 aDELETE和 an INSERT。”

引用自:https://dba.stackexchange.com/questions/137432