如果我在插入后重新启动标识符列,脚本文件会出错

Error in Script File If I Restart Identifyer Column After Insert

是否可以在插入行后重新启动 HSQLDB 的 ID 列?我什至可以将其设置为以低于 table 中现有 ID 的值重新启动吗?

情况

我有一个简单的 Java 程序,它像这样连接到 HSQLDB:

DriverManager.getConnection("jdbc:hsqldb:file:" + hsqldbPath, "", "");

这在执行以下脚本时给了我一个 HsqlException(这是一个摘录,可以找到 HSQLDB 2.2.4 的完整脚本 here):

SET SCHEMA PUBLIC
CREATE MEMORY TABLE PUBLIC.MAP(
    ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,
    FOO VARCHAR(16) NOT NULL)
ALTER TABLE PUBLIC.MAP ALTER COLUMN ID RESTART WITH 1
// [...]
SET SCHEMA PUBLIC
INSERT INTO MAP VALUES(1,'Foo')
INSERT INTO MAP VALUES(2,'Bar')
ALTER TABLE PUBLIC.MAP ALTER COLUMN ID RESTART WITH 42

留言是:

HsqlException: error in script file: ALTER TABLE PUBLIC.MAP ALTER COLUMN ID RESTART WITH 42

当我将 RESTART-命令移动到 INSERT 之前时,异常消失了。 documentation 没有给出为什么需要这样做的提示。

我最终不得不在 2.2.4 版上完成这项工作,但在当前的 2.3.2 版上也有同样的问题。

背景

我在这里想做的是重现生产中明显发生的情况:与数据库的不幸交互(我不知道到底发生了什么)似乎导致新插入的行与现有行发生冲突一个,因为他们获得了相同的 ID。我想创建一个复制场景的测试,以便编写正确的修复程序。

数据库的.script 文件遵循语句的预定义顺序。如果对其进行了编辑,则不应对其进行更改,并且只允许进行某些手动更改(有关详细信息,请参阅 the guide)。

您可以在测试开始时通过 JDBC 执行 ALTER TABLE 语句,而不是将其插入脚本中。

如果 PRIMARY KEY 的 IDENTITY 值发生冲突,您将在插入值时遇到异常。

解决此类问题的实际方法是重新启动主键列中的最大值加一。

我认为 SEQUENCES are much more flexiblee 比身份。顺便说一下,IDENTITY 生成器禁用了 JDBC 批处理。

但是如果你使用 SEQUENCE 标识符,你也必须注意 hilo optimizers,因为标识符是由 Hibernate 使用序列值作为基础计算起点生成的。

使用 SEQUENCE the restart 是这样的:

ALTER SEQUENCE my_seqeunce RESTART WITH 105;