gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:55 28 4
gpt4 key购买 nike

插入行后是否可以重新启动 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 命令移到 INSERT 之前时,异常就会消失。 documentation没有暗示为什么这是必要的。

我最终必须在版本 2.2.4 上实现此功能,但在当前版本 2.3.2 中也存在同样的问题。

背景

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

最佳答案

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

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

如果 PRIMARY KEY 的 IDENTITY 值发生冲突,则在插入这些值时将会出现异常。

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

关于java - 如果插入后重新启动标识符列,脚本文件会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28216235/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com