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

11

有没有不需要使用序列和触发器的简单方法?我具备平均水平的 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个回答

13

标准方法是使用serialbigserial数据类型:

数据类型“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 类型在幕后的确创建了序列,但您不需要直接使用这些序列。


2
原始表格中写着 id bigint ...,因此更好的等价物应该是 bigserial - cjm
我以为它可能是基于串行的,因为在pgadmin中看到了一些相关内容,但每次我在Google中搜索“serial”或“plsql”关键字时,都会得到一堆破解软件的链接:(所以非常感谢你! - user4903
2
@hal100001:你可能想要收藏PostgreSQL文档,它非常好,甚至包括索引。 - mu is too short

3
在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. 关于身份列和序列的好文章
  2. 请参阅PostgreSQL 文档了解更多信息(使用Ctrl+F搜索“AS IDENTITY”)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接