「实习记录」insert or update操作

依然是mentor要求(mentor是个严格的好人),insert的时候最好不要直接插入信息,先根据unique key判断信息是否已经存在,如果存在就update,反之insert。

根据这个要求我们可以google到一个叫insert or update的方法,即on duplicate key update,只要设置一个unique key,就会自动根据其判断是否已存在。

这是一个很好的方法,如果你没有使用auto increment主键。

测试发现对于自增主键来说,只要程序进入insert,就会给主键值加一,也就是不论是程序实际进行的是update操作,还是insert操作出现错误(eg:主键重复),自增主键都会加一。即如果第一次insert成功,主键为1,中间出现了两次update或是错误,下一次insert的主键就会是4。

在update操作非常多的数据集中,或是在需要转移数据库次数较多的情况下,这样的操作都会带来非常严重的问题。

(在mentor的指导下我测试了最新的mariadb数据库(10.3.6),这个问题依然没有得到解决。查找发现replace into同样会出现这种情况。)

最后我选择的解决方式是将insert和update拆开,先用count查找某个记录是否存在,count会返回该记录的数值,根据数值是否为0判断记录是否存在,如果以存在,就调用update,如果不存在就调用insert。

举个栗子:

try{

if(employeeMapper.selectCount(key) !=0)

{

employeeMapper.updateByEmployee(employee);

}

else

    {

employeeMapper.insertSelective(employee);

}

}catch (DataAccessException e)

{

logger.info(e.getMessage());

}

你可能感兴趣的:(「实习记录」insert or update操作)