在PostgreSQL中生成自动递增主键的可接受方法是什么?

时间:2011-05-13 22:31:49

标签: postgresql auto-increment

没有序列和触发器,没有简单的方法吗?我有平均的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)
);

2 个答案:

答案 0 :(得分:13)

标准方法是使用serial or bigserial

  

数据类型serial和bigserial不是真正的类型,而只是用于创建唯一标识符列的符号方便(类似于其他一些数据库支持的AUTO_INCREMENT属性)。
  [...]
  因此,我们创建了一个整数列,并安排其默认值从序列生成器分配。

所以你要用这样的东西创建表:

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)
);

serialbigserial类型会在幕后创建序列,但您无需直接使用序列。

答案 1 :(得分:1)

在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. 关于identity columns vs serial的好文章。
  2. PostgreSQL documentation了解更多信息(Ctrl + F和搜索" AS IDENTITY")。