指定为 1 时 Derby 自动递增 100

Derby Auto Increment by 100 when specified as 1

我使用下面的语句创建了一个 Derby 数据库 table 具有自动增量主列。

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。我的语句有没有错误?

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

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

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

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

感谢@manish,第二个选项对我有用。

为了实施第二个解决方案,请在设置数据库连接的位置添加以下代码行,如下例所示。

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
String URL = "jdbc:derby:testDB;create=true;";
conn = DriverManager.getConnection(URL);
System.setProperty("derby.language.sequence.preallocator", "1"); // Add this line

感谢@xfocus99提供的answer,让我知道如何实现第二个解决方案。