Каков приемлемый метод для генерации автоматически увеличивающегося первичного ключа в PostgreSQL?

#postgresql #auto-increment

#postgresql #автоматическое увеличение

Вопрос:

Неужели нет простого способа сделать это без последовательностей и триггеров? У меня средние навыки работы с SQL, и я хочу использовать стандартный отраслевой метод для pl / sql (PostgreSQL). Я в основном конвертирую этот пример таблицы из Spring Security:

 create table group_members (
    id bigint generated by default as identity(start with 0) primary key,
    username varchar(50) not null,
    group_id bigint not null,
    constraint fk_group_members_group foreign key(group_id) references groups(id));
  

Что у меня есть на данный момент:

 CREATE TABLE auth_group_members (
    id NUMBER,
    username VARCHAR(50) NOT NULL,
    group_id NUMBER NOT NULL,
    CONSTRAINT "FK_AuthGroupMembers" FOREIGN KEY(group_id) REFERENCES auth_groups(id)
);
  

Ответ №1:

Стандартным способом было бы использовать serial или bigserial :

Типы данных serial и bigserial не являются истинными типами, а просто служат для удобства обозначения для создания столбцов уникальных идентификаторов (аналогично свойству AUTO_INCREMENT, поддерживаемому некоторыми другими базами данных).
[…]
Таким образом, мы создали столбец integer и организовали присвоение ему значений по умолчанию из генератора последовательностей.

Итак, вы бы создали таблицу с чем-то вроде этого:

 CREATE TABLE auth_group_members (
    id bigserial primary key,
    username VARCHAR(50) NOT NULL,
    group_id NUMBER NOT NULL,
    CONSTRAINT "FK_AuthGroupMembers" FOREIGN KEY(group_id) REFERENCES auth_groups(id)
);
  

Типы serial и bigserial создают последовательности за кулисами, но вам никогда не придется работать с последовательностью напрямую.

Комментарии:

1. В исходной таблице указано, id bigint ... поэтому лучшим эквивалентом было бы bigserial .

2. Я думал, что это может быть serial, основанный на том, что я видел в pgadmin, но каждый раз, когда я искал serial или ключевые слова plsql в Google, я получал кучу ссылок на взломанное программное обеспечение : ( Так что большое спасибо вам!

3. @hal100001: Возможно, вы захотите добавить в закладки документацию по PostgreSQL , она очень хороша и даже включает индекс.

Ответ №2:

В PostgreSQL 10 вы можете использовать identity columns . Вот пример:

 create table group_members (
    id bigint generated by default as identity(start with 1) primary key,
    username varchar(50) not null,
    group_id bigint not null
    );
  

Дополнительно:

  1. Хорошая статья о столбцах идентификаторов в сравнении с serial.
  2. Документация по PostgreSQL для получения дополнительной информации (Ctrl F и поиск «КАК ИДЕНТИФИКАТОР»).