【发布时间】:2015-01-29 13:42:02
【问题描述】:
是否可以在插入行后重新启动 HSQLDB 的 ID 列?我什至可以将其设置为以低于表中现有 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-command 移到INSERTs 之前时,异常消失了。 documentation 没有暗示为什么需要这样做。
我最终将不得不在 2.2.4 版本上完成这项工作,但在当前版本 2.3.2 上遇到同样的问题。
背景
我在这里尝试做的是重现生产中明显发生的情况:与数据库的不幸交互(我不知道到底发生了什么)似乎导致新插入的行与现有行发生冲突,因为他们获得了相同的身份证。我想创建一个复制场景的测试,以便编写正确的修复程序。
【问题讨论】: