java - 指定为 1 时 Derby 自动递增 100

标签 java spring auto-increment derby

我使用下面的语句创建了一个具有自动递增主列的 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,我的语句是否有错误?

enter image description here

最佳答案

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

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

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

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

关于java - 指定为 1 时 Derby 自动递增 100,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31804210/

相关文章:

Spring Security 延长每个请求的 JWT token 过期时间

spring - Spring Data JPA 问题 - BeanEntityManagerFactory

java - Spring Boot Logback DB Appender 属性

MySQL auto_increments 总是插入 2147483647

java - 如何使用 Spring Data Redis Repositories 构建动态查询?

java - 类中的类设置变量会更改所有变量

java - 如何以编程方式获取应用程序的版本

java - Spring 宠物诊所 : "${owner.new}" contains invalid expression(s), Tomcat (6.0.32)

java - MySQL中的严格自动增量值

mysql - 连续手动更新主键会导致后续插入失败/键的重复条目