如果我在插入后重新启动识别器列,则脚本文件中的错误
Posted
技术标签:
【中文标题】如果我在插入后重新启动识别器列,则脚本文件中的错误【英文标题】:Error in Script File If I Restart Identifyer Column After Insert 【发布时间】: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 移到INSERT
s 之前时,异常消失了。 documentation 没有暗示为什么需要这样做。
我最终将不得不在 2.2.4 版本上完成这项工作,但在当前版本 2.3.2 上遇到同样的问题。
背景
我在这里尝试做的是重现生产中明显发生的情况:与数据库的不幸交互(我不知道到底发生了什么)似乎导致新插入的行与现有行发生冲突,因为他们获得了相同的身份证。我想创建一个复制场景的测试,以便编写正确的修复程序。
【问题讨论】:
【参考方案1】:数据库的 .script 文件遵循语句的预定义顺序。如果已对其进行编辑并且仅允许某些手动更改,则不应更改此内容(有关详细信息,请参阅the guide)。
您可以在测试开始时通过 JDBC 执行 ALTER TABLE 语句,而不是将其插入脚本中。
如果 PRIMARY KEY 的 IDENTITY 值发生冲突,则在插入值时会出现异常。
解决此类问题的实际方法是使用主键列中的最大值加一来重新启动。
【讨论】:
通过 JDBC 执行ALTER TABLE ...
有效,谢谢。我默默地期望通过 JDBC 和通过脚本的查询得到相同的处理。您能否链接到您(显然是正确的)假设不是这种情况的来源?
查看 HSQLDB 指南以了解对 .script 文件的更改。
我只发现this 确实限制了有效查询(并且可以说禁止我的查询,因为它“影响[s] 现有数据的完整性”)但不支持您声明的普遍性。我们中的一个人可以改写您的第一句话并包含链接。然后我会接受答案。【参考方案2】:
我认为SEQUENCES are much more flexiblee 比 IDENTITY。顺便说一下,IDENTITY 生成器禁用了 JDBC 批处理。
但是如果你使用 SEQUENCE 标识符,你也必须注意hilo optimizers,因为标识符是 Hibernate 使用序列值作为基础计算起点生成的。
使用 SEQUENCE the restart 如下所示:
ALTER SEQUENCE my_seqeunce RESTART WITH 105;
【讨论】:
以上是关于如果我在插入后重新启动识别器列,则脚本文件中的错误的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中满足某些条件(如果)后,如何重新启动 while 循环? [关闭]