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