我使用下面的语句创建了一个具有自动递增主列的 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,我的语句是否有错误?
最佳答案
这是由于 pre-allocation of values for auto-increment columns . Derby 是一个内存数据库,当数据库首次加载到内存中时会缓存自动增量值。然后,使用缓存生成自增列的 future 值,而不是一次又一次地查询数据库。如果数据库未正确关闭,缓存中未使用的值将永远丢失。
您有两种选择来解决这个问题:
- 将
;shutdown=true
添加到 JDBC URL。这将在应用程序结束时关闭数据库。 - 设置
derby.language.sequence.preallocator
属性设置为1
(默认值为100
)。这将确保列值永远不会被缓存。
请注意,大多数数据库对序列的行为相似。例如,H2 具有完全相同的行为,但使用缓存大小 32
而不是像 Derby 那样的 100
。
关于java - 指定为 1 时 Derby 自动递增 100,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31804210/