H2 相当于 Postgres `SERIAL` 或 `BIGSERIAL` 列?
H2 equivalent of Postgres `SERIAL` or `BIGSERIAL` column?
在Postgres, defining a column with SERIAL
/BIGSERIAL
has a triple effect as discussed here中:
- 定义一个
int
/bigint
列。
- 创建序列对象以生成自动递增的数字。
- 设置列的默认值以在序列上调用
nextval()
。
在H2中是否有类似的快捷命令来获取这组相关的行为?
如果不是,SQL 的长版是什么?
Where does the sequence live? How can you adjust its value or reset it?
如果您将列创建为 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 的串行数据类型基本相同
If not, what would the long version of the SQL be?
create sequence foo_id_seq;
create table foo
(
id integer default foo_id_seq.nextval,
other_column varchar(20)
);
这与 Postgres serial
的最大区别在于 H2 不知道列的序列 "belongs"。删除table时需要手动删除。
foo_id_seq.nextval
实际上会在创建 table 时转换为 (NEXT VALUE FOR PUBLIC.FOO_ID_SEQ)
(并且会像 information_schema.columns
.
中那样存储)
在Postgres, defining a column with SERIAL
/BIGSERIAL
has a triple effect as discussed here中:
- 定义一个
int
/bigint
列。 - 创建序列对象以生成自动递增的数字。
- 设置列的默认值以在序列上调用
nextval()
。
在H2中是否有类似的快捷命令来获取这组相关的行为?
如果不是,SQL 的长版是什么?
Where does the sequence live? How can you adjust its value or reset it?
如果您将列创建为 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 的串行数据类型基本相同
If not, what would the long version of the SQL be?
create sequence foo_id_seq;
create table foo
(
id integer default foo_id_seq.nextval,
other_column varchar(20)
);
这与 Postgres serial
的最大区别在于 H2 不知道列的序列 "belongs"。删除table时需要手动删除。
foo_id_seq.nextval
实际上会在创建 table 时转换为 (NEXT VALUE FOR PUBLIC.FOO_ID_SEQ)
(并且会像 information_schema.columns
.