【问题标题】:H2 equivalent of Postgres `SERIAL` or `BIGSERIAL` column?H2 相当于 Postgres `SERIAL` 或 `BIGSERIAL` 列?
【发布时间】:2016-07-14 16:01:17
【问题描述】:

Postgres 中,使用SERIAL/BIGSERIAL 定义列具有discussed here 的三重效果:

  • 定义一个int/bigint 列。
  • 创建一个序列对象以生成自动递增的数字。
  • 将列的默认设置为在序列上调用nextval()

H2 中是否有类似的快捷命令来获取这组相关的行为?

如果不是,那么长版本的 SQL 会是什么?

【问题讨论】:

  • IDENTITY 是自动增量等价物,H2 文档会告诉你
  • @NeilStockton 序列在哪里?如何调整它的值或重置它? IDENTITY 类型的文档并没有说太多。在 Postgres 中,序列是数据库中的一个单独对象,由列拥有。
  • 这不是 H2 也支持的序列。 MySQL 中的 AUTOINCREMENT 与 IDENTITY 相同......它增加了该列。

标签: primary-key h2 auto-increment


【解决方案1】:

序列在哪里?如何调整它的值或重置它?

如果您将列创建为auto_increment(或identity),H2 会在后台创建一个序列。该序列的名称可以通过查看information_schema.columns获得:

create table foo 
(
  id           integer auto_increment,
  other_column varchar(20)
);

如果你随后运行:

select column_name, column_default
from information_schema.columns
where table_name = 'FOO'
and table_schema = 'PUBLIC';

你会得到这样的东西:

COLUMN_NAME  | COLUMN_DEFAULT                                                              
-------------+-----------------------------------------------------------------------------
ID           | (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_C1C36118_ED1C_44D6_B573_6C00C5923EAC)
OTHER_COLUMN |                                                                            

您可以毫无问题地更改该顺序:

alter sequence SYSTEM_SEQUENCE_C1C36118_ED1C_44D6_B573_6C00C5923EAC 
   restart with 42;

这与 Postgres 的串行数据类型基本相同

如果不是,那么长版本的 SQL 会是什么?

create sequence foo_id_seq;

create table foo 
(
  id           integer default foo_id_seq.nextval,
  other_column varchar(20)
);

这与 Postgres serial 之间的最大区别在于 H2 不知道序列“属于”列。删除表时需要手动删除。

foo_id_seq.nextval 实际上会在创建表时转换为(NEXT VALUE FOR PUBLIC.FOO_ID_SEQ)(并且会像在information_schema.columns 中那样存储。

【讨论】:

  • 系统生成的序列在 Hibernate 中运行良好。但是像“foo_id_seq.nextval”这样生成的自定义序列无法正常工作。我检查了 information_schema.columns 并发现有一个名为 IS_GENERATED 的列,对于系统生成的序列为 true,但对于自定义序列为 false。知道如何为自定义序列将其设置为 true 吗?
猜你喜欢
  • 2012-07-03
  • 2017-09-27
  • 2019-11-16
  • 2014-11-19
  • 2021-11-30
  • 2021-03-27
  • 2012-04-26
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多