【问题标题】:What is the acceptable method for generating an auto incrementing primary key in PostgreSQL?在 PostgreSQL 中生成自增主键的可接受方法是什么?
【发布时间】:2011-08-25 07:11:18
【问题描述】:

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

【问题讨论】:

    标签: postgresql auto-increment


    【解决方案1】:

    标准方法是使用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 类型确实会在幕后创建序列,但您不必直接使用序列。

    【讨论】:

    • 原来的表是id bigint ...,所以更好的等价物是bigserial
    • 根据我在 pgadmin 中看到的内容,我认为它可能是串行的,但是每次我在 Google 中搜索串行或 plsql 关键字时,我都会得到一堆破解软件的链接 :( 所以非常感谢你!
    • @hal100001:您可能想为PostgreSQL documentation添加书签,它非常好,甚至还包括一个索引。
    【解决方案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. 关于identity columns vs serial的好文章。
    2. PostgreSQL documentation 了解更多信息(Ctrl+F 并搜索“AS IDENTITY”)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2011-06-19
      • 2013-02-28
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多