MySQL使用经验——在批量插入数据时如果跳过主键重复的数据,从而不影响其它数据的插入

分类:计算机 | 数据库 | MySQL | 数据导入导出 1519
更新:2021-08-24 00:03:30
编辑

说明

有时候我们在mysql中执行一个sql脚本批量插入数据的操作时中途出现了一些意外导致插入操作终止了,这个时候可能已经插入了一部分数据,而且我们也不知道具体插入了哪一部分的数据;如果我们直接再次执行sql脚本的话必然会出现主键重复的错误,导致其它数据也不能正常地插入数据库,我们可以通过下面的方法来解决这个问题。

方法1——使用关键字ignore

示例:

INSERT IGNORE INTO `sys_dic` (`ID`, `PARENTID`, `NAME`, `ALIASNAME`, `SORT`, `REMARK`, `CODE`) VALUES ('019731e9-5e66-4c4c-954d-4adbc427ddcc', 'badd7347-d409-4f9c-91a5-61160b365d9b', '1:20000', NULL, '7', '', '111008');

说明:ignore关键字的作用就是在插入时会检索主键列表,如存在相同主键记录,不更改原纪录,只插入新的记录。

ignore关键字所修饰的SQL语句执行后,在遇到主键冲突时会返回一个0,代表并没有插入此条数据。如果主键是由后台生成的(如uuid),我们可以通过判断这个返回值是否为0来判断主键是否有冲突,从而重新生成新的主键key。

方法2——使用关键字replace

示例:

REPLACE INTO `sys_dic` (`ID`, `PARENTID`, `NAME`, `ALIASNAME`, `SORT`, `REMARK`, `CODE`) VALUES ('019731e9-5e66-4c4c-954d-4adbc427ddcc', 'badd7347-d409-4f9c-91a5-61160b365d9b', '1:20000', NULL, '7', '', '111008');

说明:插入时如发现主键已经存在,则替换原记录,即先删除原记录,后插入新的记录。

方法3——on duplicate key update

示例:

INSERT INTO `sys_dic` (`ID`, `PARENTID`, `NAME`, `ALIASNAME`, `SORT`, `REMARK`, `CODE`) VALUES ('019731e9-5e66-4c4c-954d-4adbc427ddcc', 'badd7347-d409-4f9c-91a5-61160b365d9b', '1:20000', NULL, '7', '', '111008') on duplicate key update code='111';

说明:插入时如果发现主键已存在,则对字段code进行更新操作。