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。