这是一个很经典的面试题了,说的是 MySQL中不存在待插入的数据时,就将待插入的数据插入到MySQL中,如果存在待插入的数据时执行更新操作。
前提
这里判断是否存在是根据唯一索引来判断的,也就是说你要使用接下来所说的的语句,数据库中必须存在唯一索引
insert ignore
数据库中必须存在唯一索引
首先来说一下,存在则忽略,那么我们可以使用 insert ignore 语句进行插入,如果存在这个记录就会忽略
示例:
INSERT IGNORE blog VALUES (1,'aa23');
ON DUPLICATE KEY UPDATE
INSERT INTO blog(id,blog.`name`) VALUES (1,'vvaaa'),(3,'333'),(4,'444') ON DUPLICATE KEY UPDATE blog.`name`='errors';
这里指的是,如果插入的记录存在了,那么就对当前行执行后面的Update
语句。
上面是静态指定name
的值,如果要动态指定;
INSERT INTO blog(id,NAME) VALUES (1,'vvaaa'),(3,'333'),(4,'444') ON DUPLICATE KEY UPDATE blog.`name`=VALUES(NAME)
REPLACE
REPLACE
的用法和insert一样:
REPLACE INTO blog(id,NAME) VALUES (1,'wwwww')
如果存在则更新,不存在插入
但是注意,如果是更新的话:
可以看到一共 2 行受到影响,这是因为它的更新操作是 先删除,后插入,所以会是2行