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,

Другие вопросы по тегам