相当于Postgres`SERIAL`或`BIGSERIAL`列的H2?

时间:2016-03-27 06:45:53

标签: primary-key h2 auto-increment

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

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

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

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

1 个答案:

答案 0 :(得分:6)

  

序列在哪里生活?如何调整其值或重置?

如果您将列创建为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中那样存储。