HOWTO · MySQL

如何在 MySQL 中插入還不存在的行

本文將演示如何在 mySQL 中插入一條還不存在的記錄到表中。

本頁內容

本教程告訴你如何在 mySQL 中插入一條還不存在的記錄到表中。

有三種簡單的方法可以完成這個問題,通過使用 REPLACE、INSERT IGNORE 或者 INSERT ... ON DUPLICATE KEY UPDATE。

首先,我們想象一下,我們有一個表 person,結構是這樣的。

CREATE TABLE person (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
address VARCHAR(128) 
);

有以下現有記錄。

id name age address
1 John Doe 27 New York, New York
2 Jane Doe 26 Berlin, Germany
3 Chun Li 24 Beijing, China
4 Thor Odinson 40 Asgard

現在讓我們進入實際的解決方案。

在 MySQL 中使用 REPLACE 來插入還不存在的記錄

REPLACE 的作用是,當發現現有記錄時,它將覆蓋現有記錄;如果它還不存在,它將插入一條新的記錄。它本質上和 UPDATE 一樣,但具有 INSERT 功能。

讓我們提供一個示例查詢,對 John Doe 執行 REPLACE。

REPLACE INTO 'person'
SET id = 1,
name = 'John Doe'`,
age = 28,
address = 'Los Angeles, California'

如果 John Doe 存在,他將被新資料覆蓋;如果他不存在,將為 John Doe 建立一個新條目。

然而,這種方法對於插入來說並不高效,因為它覆蓋了現有的記錄,而不是在發現時直接跳過。雖然它能完成工作,但並不是最好的方法。

當查詢選擇 John Doe 時,新的結果將是這樣的。

id name age address
1 John Doe 28 Los Angeles, California

John Doe 的年齡和地址已經被 REPLACE 指令碼修改或更新。

在 MySQL 中使用 INSERT IGNORE 來插入如果不存在的資訊

我們在上面的表上也會使用同樣的未編輯資料來進行。

在 INSERT IGNORE 上,如果記錄的主鍵已經存在於資料庫中,則會被悄悄忽略或跳過。

如果我們把 IGNORE 關鍵字去掉,插入一條 id 或主鍵已經存在的記錄,會中止查詢,並顯示錯誤資訊,說主鍵的記錄已經存在。

在 INSERT 之後,IGNORE 則是代替了因為錯誤而中止,而只是繼續查詢,雖然沒有插入新記錄。

INSERT IGNORE person
SET 'id' = 4,
age = 1000,
address = 'Chicago'

根據我們上面宣告的表,已經存在一條 id 或主鍵 4 的記錄(Thor Odinson)。因此,這個查詢被指令碼忽略,從而沒有在資料庫中更新或插入一條記錄。

如果我們在人中查詢 Thor,結果將是。

id name age address
4 Thor Odinson 40 Asgard

查詢中的年齡和地址完全沒有影響到 id 為 4 的記錄。

在 MySQL 中使用 INSERT ... ON DUPLICATE KEY UPDATE 插入如果不存在的記錄

如果你使用 ON DUPLICATE KEY UPDATE 子句,並且你要插入的行是 UNIQUE 索引或主鍵中的重複,該行將執行 UPDATE。

這本質上和 REPLACE 做的事情是一樣的。

比方說,我們要插入一條 id 為 2 的記錄。

INSERT INTO person (id, name, age, address)
VALUES (1, 'Jane Deer', '33', 'Tallahassee Florida')
ON DUPLICATE KEY UPDATE id = id+1;

id 是遞增的,以生成一個新的記錄,而不是更新現有的記錄。

如果我們查詢 person 的所有記錄,那麼結果會是這樣。

id name age address
1 John Doe 27 New York, New York
2 Jane Doe 26 Berlin, Germany
3 Chun Li 24 Beijing, China
4 Thor Odinson 40 Asgard
5 Jane Deer 33 Tallahasee, Florida

Jane Deer, 不是取代 Jane doe, 而是在表中增加了一條新記錄。

處理插入和檢查它的存在,最有效的方法肯定是使用 INSERT IGNORE。

不過,另外兩個關鍵字也是可以根據具體情況使用的,如果有一天你想更新你要插入的行是否存在,就使用 REPLACE。如果你不想修改行,但真的想插入新的記錄,使用 INSERT ... ON DUPLICATE KEY UPDATE。