不灭的火

革命尚未成功,同志仍须努力下载JDK17

作者:AlbertWen  添加时间:2025-04-12 22:04:18  修改时间:2025-04-25 17:58:00  分类:01.PostgreSQL  编辑

在PostgreSQL中,建立自增主键通常有两种方法:

1.使用 SERIAL 数据类型

当你在创建表时,可以将某个字段的类型指定为 SERIAL,这样PostgreSQL会自动为该字段创建一个“序列”,并设置为自增。

也就是说:SERIAL本质上还是一个“序列” !

例如:

CREATE TABLE my_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

这种方法会自动创建一个序列,并在插入新记录时自动递增。

2.手动创建序列并设置默认值

如果你需要更细粒度的控制,可以手动创建一个序列,并将其设置为某个字段的默认值。例如:

注:一般序列名称由“数据表名+主键字段+seq组成  (通常情况下主键字段即为自增字段),如下表名为cof_table_hot_analysis,主键字段为 id

CREATE SEQUENCE my_table_id_seq;

CREATE TABLE my_table (
    id INT PRIMARY KEY DEFAULT nextval('my_table_id_seq'),
    name VARCHAR(100)
);

这种方法给了你更多的灵活性,比如可以设置序列的起始值、步长等:

CREATE SEQUENCE my_table_id_seq
  START WITH 1
  INCREMENT BY 1
  NO MINVALUE
  NO MAXVALUE
  CACHE 1;

 

上述操作的自增字段id默认值是1,如果需要设置自增之后的其他数值,例如16

select setval('my_table_id_seq', 16)

 

清空表格时要重置序列新数据才会从1开始自增

TRUNCATE TABLE my_table RESTART IDENTITY

 

扩展:

(1)删除序列:

DROP SEQUENCE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

(2)修改序列:

ALTER SEQUENCE name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ]
    [ RESTART [ [ WITH ] restart ] ]
    [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table.column | NONE } ]
ALTER SEQUENCE name OWNER TO new_owner
ALTER SEQUENCE name RENAME TO new_name
ALTER SEQUENCE name SET SCHEMA new_schema

(3)序列的其他方法

相关的方法如下(regclass 表示序列的名称):

函 数 返 回 类 型 描 述
currval( regclass ) bigint 获取指定序列最近一次使用netxval后的数值,如果没有使用nextval而直接使用currval会出错。
lastval() bigint 返回最近一次用 nextval 获取的任意序列的数值
nextval( regclass ) bigint 递增序列并返回新值
setval( regclass,bigint ) bigint 设置序列的当前数值
setval( regclass,bigint ,boolean ) bigint 设置序列的当前数值以及 is_called 标志,如果为true则立即生效,如果为false,则调用一次nextval后才会生效

示例:获取当前序列

select currval('序列名')

 

此外,从PostgreSQL 10开始,你还可以使用 IDENTITY 数据类型来创建自增列,这与 SERIAL 类型类似,但是 IDENTITY 是遵循 SQL 标准的写法:

CREATE TABLE my_table (
    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name VARCHAR(100)
);

还有使用 smallserialserialbigserial 数据类型,它们分别对应不同的数据范围,可以根据自己的需求选择合适的类型:

CREATE TABLE my_table (
    id bigserial PRIMARY KEY,
    name VARCHAR(100)
);

3.使用UUID

如果你需要全局唯一的标识符,可以使用UUID:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE my_table (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    name VARCHAR(100)
);

选择哪种方法取决于你的具体需求,比如是否需要全局唯一性、是否需要跨数据库迁移等。通常情况下, SERIAL 或 IDENTITY 类型足以满足大多数场景的需求。

 

 

参考:

  1. PostgreSQL如何设置主键自增(序列、SERIAL)
  2. PostgreSQL导入数据库表并重设自增属性