問題:
根據維基百科對 UPSERT 的定義,它結合了 INSERT 和 UPDATE 運算。其目標是實現單一操作,根據記錄是否存在來更新現有記錄或插入新記錄。
疑問:
是否可以在 SQLite 中執行 UPSERT,而無需先進行 SELECT 來決定需要更新還是插入?
解答:
SQLite 中的 UPSERT 支援
SQLite 3.24.0 版本透過使用 ON CONFLICT 子句引入了對 UPSERT 的支援。
文法:
<code class="language-sql">INSERT OR REPLACE INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...) ON CONFLICT (约束名) DO UPDATE SET 列1 = 值1, 列2 = 值2, ...</code>
範例:
考慮一個包含 id、name 和 role 欄位的表。讓我們建立一個 UPSERT 語句,如果 id 存在則更新 name 和 role,否則插入具有 role 預設值的記錄。
<code class="language-sql">INSERT OR REPLACE INTO Employee (id, name, role) VALUES (1, 'John Doe', 'CEO') ON CONFLICT (id) DO UPDATE SET name = 'John Doe', role = 'CEO';</code>
替代方案:
在 SQLite 支援 UPSERT 之前,有一些繁瑣的方法可以實現類似的功能:
與 SELECT 的比較:
UPSERT 通常比先進行 SELECT 更有效率,因為它在一個查詢中執行插入或更新操作。但是,如果表非常大,在某些情況下 SELECT 可能會更快。
以上是SQLite 可以在沒有初步 SELECT 語句的情況下執行 UPSERT 運算嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!