MySQL - Upsert



MySQL UPSERT 操作

MySQL 的UPSERT操作將 INSERT 和 UPDATE 合併到一個語句中,允許您將新行插入表中,或者如果該行已存在則更新現有行。我們可以從名稱 (UPSERT) 本身理解,其中 UP 代表 UPDATE,SERT 代表 INSERT。

本教程涵蓋了在 MySQL 中執行 UPSERT 操作的三種常見方法:INSERT IGNORE、REPLACE 和帶 ON DUPLICATE KEY UPDATE 的 INSERT。

使用 INSERT IGNORE 進行 UPSERT

MySQL 中的 INSERT IGNORE 語句允許您將新記錄插入表中。如果具有相同主鍵的記錄已存在,則它會忽略錯誤並且不會插入新記錄。

示例

首先,讓我們使用以下查詢建立一個名為COURSES的表:

CREATE TABLE COURSES(
   ID int,
   COURSE varchar(50) primary key,
   COST int
);

在這裡,我們將記錄插入 COURSES 表中:

INSERT INTO COURSES VALUES 
(1, "HTML", 3000),
(2, "CSS", 4000),
(3, "JavaScript", 6000),
(4, "Node.js", 10000),
(5, "React.js", 12000),
(6, "Angular", 8000),
(7, "Php", 9000);

獲得的 COURSES 表如下:

ID 課程 費用
6 Angular 8000
2 CSS 4000
1 HTML 3000
3 JavaScript 6000
4 Node.js 10000
7 Php 9000
5 React.js 12000

現在,我們嘗試使用以下查詢中的 INSERT INTO 語句插入重複記錄:

INSERT INTO COURSES VALUES (6, 'Angular', 9000);

這會導致錯誤,因為無法插入重複記錄:

ERROR 1062 (23000): Duplicate entry 'Angular' for key 'courses.PRIMARY'

使用 INSERT IGNORE:

現在,讓我們使用 INSERT IGNORE 語句執行相同的操作:

INSERT IGNORE INTO COURSES VALUES (6, 'Angular', 9000);

輸出

正如我們在下面的輸出中看到的,INSERT IGNORE 語句忽略了錯誤:

Query OK, 0 rows affected, 1 warning (0.00 sec)

驗證

我們可以驗證 COURSES 表以檢視錯誤是否被忽略,方法是使用以下 SELECT 查詢:

SELECT * FROM COURSES;

獲得的表如下:

ID 課程 費用
6 Angular 8000
2 CSS 4000
1 HTML 3000
3 JavaScript 6000
4 Node.js 10000
7 Php 9000
5 React.js 12000

使用 REPLACE 進行 UPSERT

MySQL REPLACE 語句首先嚐試刪除現有行(如果存在),然後插入具有相同主鍵的新行。如果該行不存在,則它只會插入新行。

示例

讓我們替換或更新 COURSES 表中的行。如果 COURSE 為“Angular”的行已存在,它將使用提供的新的值更新其 ID 和 COST 的值。否則,將使用查詢中指定的值插入新行:

REPLACE INTO COURSES VALUES (6, 'Angular', 9000);

輸出

上面查詢的輸出如下所示:

Query OK, 2 rows affected (0.01 sec)

驗證

現在,讓我們使用以下 SELECT 查詢驗證 COURSES 表:

SELECT * FROM COURSES;

我們可以在下表中看到,REPLACE 語句在刪除重複行後添加了一行:

ID 課程 費用
6 Angular 9000
2 CSS 4000
1 HTML 3000
3 JavaScript 6000
4 Node.js 10000
7 Php 9000
5 React.js 12000

使用帶 ON DUPLICATE KEY UPDATE 的 INSERT 進行 UPSERT

MySQL 中的 INSERT ... ON DUPLICATE KEY UPDATE 語句嘗試插入新行。如果該行已存在,則它會使用語句中指定的新值更新現有行。

示例

在這裡,我們使用以下查詢更新重複記錄:

INSERT INTO COURSES VALUES (6, 'Angular', 9000)
ON DUPLICATE KEY UPDATE
ID = 6, COURSE = 'Angular', COST = 20000;

輸出

正如我們在下面的輸出中看到的,沒有生成錯誤,並且重複的行被更新了。

Query OK, 2 rows affected (0.01 sec)

驗證

讓我們使用以下 SELECT 查詢驗證 COURSES 表:

SELECT * FROM COURSES;

正如我們在下表中看到的,INSERT INTO... ON DUPLICATE KEY UPDATE 語句更新了重複記錄:

ID 課程 費用
6 Angular 20000
2 CSS 4000
1 HTML 3000
3 JavaScript 6000
4 Node.js 10000
7 Php 9000
5 React.js 12000
廣告