结论:

  • insert into
    在插入时,如果没有该数据,则插入成功;
    在插入时,如果已经存在该数据,则会报错。
  • insert ignore into
    在插入时,如果没有该数据,则插入成功;
    在插入时,如果存在数据,则会忽略掉本次插入的数据,并且原数据不变。
  • replace into
    在插入时,如果没有该数据,则直接插入新数据成功;
    在插入时,如果存在该数据,则会先删掉原先的数据,并且插入新数据进行更新。

对于某个表中是否已经存在该数据的判断依据:根据主键或者唯一索引判断。


测试的表结构:

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS actor(
actor_id smallint(5) NOT NULL,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT current_timestamp COMMENT '最后更新时间,默认是系统的当前时间',
PRIMARY KEY(actor_id)
);

测试数据:

1
2
3
INSERT INTO actor VALUES(1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'),
(2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33'),
(3, 'ED', 'CHASE', default);

查看当前表的中内容:

1
2
3
4
5
6
7
8
mysql> SELECT * FROM actor;
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 1 | PENELOPE | GUINESS | 2006-02-15 12:34:33 |
| 2 | NICK | WAHLBERG | 2006-02-15 12:34:33 |
| 3 | ED | CHASE | 2019-09-06 21:30:30 |
+----------+------------+-----------+---------------------+

insert into

1
2
3
4
5
INSERT INTO actor VALUES(3, 'huan', 'youchen', default);
// 在插入时,如果已经存在数据,则会报错,报错信息:ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
INSERT INTO actor VALUES(4, 'huan', 'youchen', default);
//在插入时,如果没有该数据,则插入成功

insert ignore into

1
2
3
4
5
INSERT IGNORE INTO actor VALUES(3, 'huan', 'youchen', default);
// 在插入时,如果存在数据,则会忽略掉本次插入,并且不会报错,会有警告Query OK, 0 rows affected, 1 warning
INSERT IGNORE INTO actor VALUES(5, 'huan', 'youchen', default);
//在插入时,如果没有该数据,则插入新数据成功

repalce into

1
2
3
4
5
REPLACE INTO actor VALUES(3, 'huan', 'youchen', default);
// 在插入时,如果存在数据,则会替换掉原先的数据,并插入新数据
REPLACE INTO actor VALUES(6, 'huan', 'youchen', default);
//在插入时,如果没有该数据,则插入新数据成功