H2 эквивалент столбца Postgres `SERIAL` или`BIGSERIAL`?
В Postgres, определяя столбец с SERIAL
/ BIGSERIAL
имеет тройной эффект, как обсуждено здесь:
- Определить
int
/bigint
колонка. - Создайте объект последовательности для генерации автоматически увеличивающихся чисел.
- Установить столбец по умолчанию для вызова
nextval()
на последовательности.
Есть ли подобная команда быстрого вызова в H2, чтобы получить этот связанный набор поведения?
Если нет, то какой будет длинная версия SQL?
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
,