结论:
- 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); //在插入时,如果没有该数据,则插入新数据成功
|