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。