SQLite的UPSERT如何有效率地處理部分更新和插入?
Jan 22, 2025 am 03:32 AM了解 SQLite 的 UPSERT 功能
UPSERT 操作是 INSERT 和 UPDATE 的組合,透過更新現有記錄或根據需要插入新記錄來有效地處理資料修改。 雖然 SQLite 直接支援 UPSERT,但優化其對部分更新的使用需要仔細考慮。
SQLite 的 UPSERT 語法
在 SQLite 版本 3.24.0 中引入,ON CONFLICT
子句可實現精確的 UPSERT 控制。 例如:
INSERT OR REPLACE INTO table (id, name) VALUES (1, 'John Foo') ON CONFLICT(id) DO UPDATE SET name = 'John Foo';
登入後複製
如果存在具有符合 name
的記錄,則會更新 id
欄位;否則,它會插入一個新行。
解決部分更新
管理部分更新(僅修改特定列,同時保持其他列不變)提出了挑戰。 考慮這種情況:更新 Blob1
和 Blob2
,但如果記錄存在則保持 Blob3
不變;如果沒有,請將 Blob3
設為 NULL。
高效率的部分更新解決方案
ON CONFLICT
子句提供了一個優雅的解決方案:
INSERT INTO table (id, Blob1, Blob2, Blob3) VALUES (1, 'Data1', 'Data2', NULL) ON CONFLICT(id) DO UPDATE SET Blob1 = 'Data1', Blob2 = 'Data2';
登入後複製
當發生衝突(匹配 Blob1
)時,此方法僅更新 Blob2
和 id
。 重要的是,如果記錄不存在,INSERT
將按照指定將 Blob3
設為 NULL。
替代方法(效率較低)
或者,SELECT
和 REPLACE
組合可以達到相同的結果:
SELECT name INTO @name FROM Employee WHERE id = 1; REPLACE INTO Employee (id, role) VALUES (1, 'code monkey', @name);
登入後複製
這透過預先讀取來保留原始的name
值。但是,與 ON CONFLICT
方法相比,此方法通常會引入更多開銷。
以上是SQLite的UPSERT如何有效率地處理部分更新和插入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在 Linux 中運行 MySQl(有/沒有帶有 phpmyadmin 的 podman 容器)
