#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
);
Дополнительно:
- Хорошая статья о столбцах идентификаторов в сравнении с serial.
- Документация по PostgreSQL для получения дополнительной информации (Ctrl F и поиск «КАК ИДЕНТИФИКАТОР»).