当指定为 1 时,Derby 自动递增 100

Posted

技术标签:

【中文标题】当指定为 1 时,Derby 自动递增 100【英文标题】:Derby Auto Increment by 100 when specified as 1 【发布时间】:2015-10-26 13:24:39 【问题描述】:

在用于创建 derby 数据库表的查询中包含主列自动增量。

CREATE TABLE \"table\" (\n"
            + " \"id\" INTEGER  NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL,\n"
            + " \"path\" VARCHAR(2000) DEFAULT NULL,\n"
            + " \"downloaded\" BOOLEAN DEFAULT false NOT NULL,\n"
            + " \"retried_times\" SMALLINT DEFAULT 0 NOT NULL,\n"
            + " \"name\" VARCHAR(40),\n"
            + " \"downloaded_date\" TIMESTAMP DEFAULT NULL,\n"
            + " PRIMARY KEY (\"id\")\n"

当我通过spring jdbc 插入一行时,它会增加 100。查询中是否有任何错误?

【问题讨论】:

【参考方案1】:

这是由于pre-allocation of values for auto-increment columns。 Derby 是一个内存数据库,它会在数据库首次加载到内存时缓存自动增量值。然后,使用缓存生成自动增量列的未来值,而不是一次又一次地查询数据库。如果数据库没有正确关闭,缓存中未使用的值将永远丢失。

您有两种选择来解决这个问题:

    ;shutdown=true 添加到 JDBC URL。这将在应用程序结束时关闭数据库。 将derby.language.sequence.preallocator 属性设置为1(其默认值为100)。这将确保永远不会缓存列值。

请注意,大多数数据库的序列行为相似。例如,H2 具有完全相同的行为,但使用的缓存大小为 32,而不是像 Derby 那样使用 100

【讨论】:

这绝对是 Derby 和 H2 中的一个严重错误。不正确关机后应检查并纠正自动增量值,在现实生活中不能保证正确关机,因为有停电,有时需要硬重置等...... 请告诉如何设置预分配器值 @RanjitVamadevan 只需插入这一行 System.setProperty("derby.language.sequence.preallocator", String.valueOf(1));

以上是关于当指定为 1 时,Derby 自动递增 100的主要内容,如果未能解决你的问题,请参考以下文章

MySQL自动递增自定义值

在oracle 怎样设置自动递增的的字段,也就是设置自动递增的ID 主键

MySQL 自动递增和选择计数

如何在 PHPMyAdmin 中使 MySql 中的字段自动递增?

自动递增值分配为输入,然后使用值从数据库中删除项目;

oracle的主键要设置默认值为自动递增,怎么处理?