当我导出我的 H2 数据库实例时
SCRIPT TO
Path dbDumpPath = backupDirPath.resolve(SQL_DUMP_FILE);
String sql = String.format("SCRIPT TO '%s'", dbDumpPath.toAbsolutePath());
jdbcTemplate.execute(sql);
命令,它不会在某些语句序列中添加“RESTART WITH <>”
CREATE SEQUENCE "PUBLIC"."TABLE4_SEQ" START WITH 1 RESTART WITH 101 INCREMENT BY 50;
CREATE SEQUENCE "PUBLIC"."TABLE5_SEQ" START WITH 1 INCREMENT BY 50;
实体类定义相同,都使用独特的序列生成器
@Entity
@Getter
@Setter
@NoArgsConstructor
@SequenceGenerator(name = "table4_seq", sequenceName = "table4_seq", allocationSize = 1)
public class Table4 implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "table4_seq")
private Integer id;
.
.
.
@Entity
@Getter
@Setter
@NoArgsConstructor
@SequenceGenerator(name = "table5_seq", sequenceName = "table5_seq", allocationSize = 1)
public class Table5 implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "table5_seq")
private Integer id;
.
.
.
如何解决这个奇怪的问题?有没有办法强制H2添加RESTART WITH部分?
当我从控制台运行查询时
ALTER SEQUENCE TABLE4_SEQ RESTART WITH 55;
然后备份,导出。但由于某种原因,在没有运行此 ALTER .. 命令的情况下拍摄的旧备份文件中,缺少 RESTART WITH 语句。
RESTART WITH
子句中的值不同时,H2 才使用
START WITH
子句导出序列。这意味着您的某些序列尚未使用或在使用初始值后重新启动。你无法改变这种行为。
如果某些序列的当前基值与您的期望不同,您只能通过使用您想要的值重新启动这些序列或获取其生成的值来更改它们。
ALTER SEQUENCE TABLE5_SEQ RESTART WITH (SELECT MAX(ID) + 1 FROM TABLE5);
通常最好使用标识列而不是序列。