在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) );
还有使用 smallserial
, serial
, bigserial
数据类型,它们分别对应不同的数据范围,可以根据自己的需求选择合适的类型:
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
类型足以满足大多数场景的需求。
参考: