【问题标题】:JDBC INSERT INTO - wrong primary keyJDBC INSERT INTO - 错误的主键
【发布时间】:2015-04-16 07:38:13
【问题描述】:

当我从下面执行代码时一切正常,但我的主键应该设置为 2,但它跳到 6,db 看起来像 id 1,下一个是 6。我从这个 db 中删除了几行之前,我很确定那就是问题所在。看起来所有内容都已删除,但仍有一些内容保留在那里。

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/","root","");
stat = con.createStatement();
stat.executeUpdate("INSERT INTO money.state (bank,wallet) VALUES (200,400)");

请帮忙。

【问题讨论】:

  • 键仅向前自动递增,它们不倾向于重复使用已分配的键,这是预期的行为
  • 如果您删除任何数据。分配的密钥仍然存在。除非你使用truncate整个表

标签: java mysql sql jdbc


【解决方案1】:

主键是自动递增的,如果您从表中删除行,那么下一个条目将来自最后一个主键 id,该主键 id 不是从表中存在的最后一个主键中删除的。这就是它的工作方式。

但是,如果您想填补空白(不推荐),则必须手动进行如下更改:

ALTER TABLE [yourtablename] AUTO_INCREMENT = 1

因此,这将根据表中现有的最高值将 auto_increment 值重置为下一个值。

【讨论】:

    【解决方案2】:

    预期的行为是为每条记录增加一个序列。当您删除任何行 或截断表(对于 Postgres) 这并不意味着该序列将从起始值开始,它只是从最后一个值继续并将其递增 increment_by因素。

    以这个序列为例

             Sequence "public.test_a_seq"
        Column     |  Type   |        Value        
    ---------------+---------+---------------------
     sequence_name | name    | test_a_seq
     last_value    | bigint  | 7
     start_value   | bigint  | 1
     increment_by  | bigint  | 1
     max_value     | bigint  | 9223372036854775807
     min_value     | bigint  | 1
     cache_value   | bigint  | 1
     log_cnt       | bigint  | 26
     is_cycled     | boolean | f
     is_called     | boolean | t
    

    现在,我在PRIMARY KEY 上删除行并添加两行具有默认值的行

    在 last_value 的那个因子之后将增加 2。

    last_value | bigint | 9

    【讨论】:

    • MySQL 文档说:当使用快速截断时,它会将任何 AUTO_INCREMENT 计数器重置为零。 从 MySQL 5.0.13 开始,AUTO_INCREMENT 计数器由 TRUNCATE TABLE 重置为零,无论是否存在外键约束。)
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多