【问题标题】:mysql last_inset_id is not returning the nextval of primarykeymysql last_insert_id 没有返回主键的 nextval
【发布时间】:2013-11-11 06:45:55
【问题描述】:

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

感谢您的宝贵回答。谢谢

【问题讨论】:

  • 如果是自增键,为什么不能在插入语句中不使用该字段?
  • 我需要在我的代码中有 id 值,因为我说过我需要有 id 值来更新数据,所以不能使用用户自动增量功能
  • LAST_INSERT_ID() 顾名思义,返回最后插入记录的ID(如果有)。您实际上是在插入后立即从数据库中读回的。这不能用于插入新记录,因为密钥已经存在于数据库中。一种选择是在您的代码中增加它,但我强烈不同意在代码中增加 id,因为它会导致很多问题。
  • @bansi,我同意你的观点,自动增量是最安全的方法,但我需要将生成的密钥取回我的代码,我已经搜索了很多 jdbctemplate 批量插入,但它不支持

标签: mysql spring spring-jdbc


【解决方案1】:

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

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

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

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

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

希望对你有帮助

【讨论】:

  • 谢谢..我增加了 1 个用户 ID+1,仍然遇到同样的问题
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多