H2数据库IDENTITY自增与手动指定ID共存问题求助
H2数据库混合自动生成ID与手动指定ID的INSERT操作解决方案
H2数据库支持混合使用自动生成ID和手动指定ID的INSERT操作,但默认配置下,IDENTITY序列不会自动识别手动插入的ID值,导致后续自动生成ID时出现主键冲突——正如你遇到的情况:手动插入ID 1、2后,自动生成仍从1开始,引发主键重复错误。
以下是可行的解决方法:
手动更新IDENTITY序列的当前值
在完成手动指定ID的INSERT操作后,执行SQL语句将序列的起始值调整为当前表中最大ID+1,确保后续自动生成的ID不会重复:ALTER TABLE test ALTER COLUMN id RESTART WITH (SELECT MAX(id) + 1 FROM test);执行该语句后,再执行
INSERT INTO test(title) VALUES ('my new value')即可正常生成ID=3的记录。使用
GENERATED ALWAYS AS IDENTITY配合OVERRIDING SYSTEM VALUE
H2 2.0及以上版本支持该语法,定义表时使用GENERATED ALWAYS AS IDENTITY,手动插入ID时添加OVERRIDING SYSTEM VALUE关键字,H2会自动识别手动插入的ID并同步更新序列值,无需额外操作:DROP TABLE IF EXISTS test; CREATE TABLE test( id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, title VARCHAR(255) ); -- 手动插入ID时指定OVERRIDING SYSTEM VALUE INSERT INTO test(id, title) OVERRIDING SYSTEM VALUE VALUES (1, 'hello'), (2, 'world'); -- 后续自动插入可正常生成ID=3的记录 INSERT INTO test(title) VALUES ('my new value');创建表时预设置序列起始值
如果是从备份导入数据,可在创建表时直接指定序列的起始值为备份数据中的最大ID+1:CREATE TABLE test( id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 3) PRIMARY KEY, title VARCHAR(255) );导入备份数据后,自动插入的ID会从指定的起始值开始,避免冲突。
你的测试版本(2.2.224、2.3.232)均支持以上三种方法,其中第二种方法无需手动维护序列值,更为推荐。
内容的提问来源于stack exchange,提问作者maddob
相关产品推荐
相关产品推荐

