mysql last_insert_id没有返回nextval的主键

时间:2013-11-11 06:45:56

标签: mysql spring spring-jdbc

我使用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();
                        }
                    }); 

感谢您的宝贵答案。感谢

1 个答案:

答案 0 :(得分:0)

你在哪里增加了用户密钥? 你得到最后一个插入的id并使用相同的。或者它被LAT_INSERT_ID()所取代? Shoudnt是ps.setLong(1,userId + 1)?

解决我之前使用过的主要问题的一种方法:

  1. 在DB中创建一个主键表,其中表名和键为列。
  2. 编写一个存储过程,给定一个表名可以提供下一个可用的主键(通过递增此表中的现有键值或您需要的任何其他算法)
  3. 您还可以使该proc传递一个数字来定义所需的数量的键,或者您可以返回一系列键(用于一次获取多个键)
  4. 例如 对于表MyTable1初始键值为0 当你调用proc getPrimaryKey(MyTable1)时,它会返回1并更新主键表。

    现在,在进行批量更新之前,您可以从此proc获取密钥并在查询中设置它们。

    希望这有帮助