0

我正在使用spring jdbctemplate将行插入mysql数据库,在批量插入mysql数据库时遇到问题。问题是,在插入第二行时,我的主键出现重复键违规。我已将 USER_KEY 放在批量更新方法中,但Duplicate entry '1' for key 'PRIMARY'在插入第二行时出现异常。

我的方法没有注释@Transactional

注意:- 我需要通过代码生成主键并将其用于更新/删除操作,因此不依赖于 auto_increment。另外 jdbctemplate 批量插入虽然不会返回生成的密钥。

这是我的代码

    private static final String USER_KEY = "SELECT LAST_INSERT_ID() FROM USER";


jd.batchUpdate(INSERT_QUERY,
                    new BatchPreparedStatementSetter() {

                        @Override
                        public void setValues(PreparedStatement ps, int count)
                                throws SQLException {
                             Long userId= jd.queryForObject(
                                        USER_KEY, Long.class);
                            UserDO Userdo = userlst
                                    .get(count);
                            ps.setLong(1, userId+1);
                            ps.setString(2, Userdo .getFirstName());
                            ps.setString(3, Userdo .getLastName());
                            ps.setString(4, Userdo .getMobile());
                            ps.setString(5, Userdo .getEmail());
                            ps.setInt(6, 0);
                        }

                        @Override
                        public int getBatchSize() {
                            return UserdoLst.size();
                        }
                    }); 

感谢您的宝贵答案。谢谢

4

1 回答 1

0

你在哪里增加了用户密钥?你得到最后插入的 id 并使用相同的。还是由 LAT_INSERT_ID() 处理?不应该是 ps.setLong(1, userId+1) 吗?

解决我以前使用过的这个主键问题的一种方法:

  1. 在数据库中创建一个以表名和键为列的主键表。
  2. 编写一个给定表名的存储过程,可以提供下一个可用的主键(通过增加此表中的现有键值或您需要的任何其他算法)
  3. 您还可以使该过程传递一个数字来定义所需的键数,或者您可以返回一系列键(用于一次获取多个键)

例如,当您调用 proc getPrimaryKey(MyTable1) 时,表 MyTable1 的初始键值为 0,它将返回 1 并更新主键表。

现在在进行批量更新之前,您可以从这个过程中获取密钥并将它们设置在您的查询中。

希望这可以帮助

于 2013-11-11T07:12:59.417 回答