PostgreSQL中实现自增的三种方式举例

 更新时间:2024年02月26日 10:50:16   作者:天真的柏拉图  
很多小伙伴在把mysql数据库里面的表导入pgsql数据库的时候,会遇到新增数据的时候id不自增,这篇文章主要给大家介绍了关于PostgreSQL中实现自增的三种方式,需要的朋友可以参考下

PG中实现自增字段的三种方式:

  • 标识列 (IDENTITY)
  • 序列 (SEQUENCE)
  • Serial类型

自增字段主要用于实现自增主键或生成唯一版本号

1.1 标识列 (IDENTITY)

标识列是SQL标准推荐实现自增的方式

示例

CREATE TABLE t_user (
    user_id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY ,
    user_name varchar(50) NOT NULL UNIQUE
)
INSERT INTO t_user (user_name) value ('tony')

说明:

  • 创建一个名为t_user的表 CREATE TABLE t_user ()

  • 字段user_id为integer类型 user_id integer

    定义为标识列且总是按照标识列生成(由系统生成) GENERATED ALWAYS AS IDENTITY

    定义为主键 PRIMARY KEY

  • 字段user_name为varchar类型

    约束其不为空且唯一 NOT NULL UNIQUE

  • 插入一条数据 INSERT INTO t_user (user_name) value (‘tony’)

    由于user_id是使用标识列实现的自增主键 由系统赋值 因此插入时只需指定user_name的值即可

原理

定义标识列之后系统后台会自动创建并维护一个名为tablename_column_seq的序列 基于此序列生成自增数据

-- SEQUENCE: public.t_user_user_id_seq

-- DROP SEQUENCE IF EXISTS public.t_user_user_id_seq;

CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seq
    INCREMENT 1
    START 1
    MINVALUE 1
    MAXVALUE 2147483647
    CACHE 1;

ALTER SEQUENCE public.t_user_user_id_seq
    OWNER TO postgres;

表删除后序列随之删除 该实现方式下表和序列是关联关系 DROP TABLE t_user

1.2 序列 (SEQUENCE)

通过定义序列的方式实现自增字段 需要在创建表之前先定义一个序列

示例

先定义序列

CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seq
    INCREMENT 1
    START 1
    MINVALUE 1
    MAXVALUE 2147483647
    CACHE 1
    NO CYCLE

说明:

  • 创建一个名为表名_自增字段名_seq的序列 CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seq
  • 参数:
    • INCREMENT 1:序列每次自增多少
    • START 1:从1开始
    • MINVALUE 1:序列的最小值
    • MAXVALUE 2147483647:序列的最大值
    • CACHE 1:缓存序列 但是服务器重启之后缓存会丢失
    • NO CYCLE / CYCLE:是否循环 序列增长到最大值之后是否从新开始 NO CYCLE表示不重新开始

再创建表

CREATE TABLE t_user (
    user_id integer DEFAULT nextval('t_user_user_id_seq') PRIMARY KEY ,
    user_name varchar(50) NOT NULL UNIQUE
)

说明:

​ DEFAULT nextval('t_user_user_id_seq'):默认值为t_user_user_id_seq序列的下一个值

nextval(‘序列’)——获取序列的下一个值

currval(‘序列’)——获取序列的当前值

删除表时序列不会随之删除 仍会保留下来

删除语句:DROP SEQUENCE IF EXISTS public.t_user_user_id_seq;

1.3 Serial

示例

CREATE TABLE t_user (
    user_id serial PRIMARY KEY ,
    user_name varchar(50) NOT NULL UNIQUE
)

原理

系统自动生成一个序列与表相关联

CREATE TABLE IF NOT EXISTS public.t_user
(
    user_id integer NOT NULL DEFAULT nextval('t_user_user_id_seq'::regclass),
    user_name character varying(50) COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT t_user_pkey PRIMARY KEY (user_id),
    CONSTRAINT t_user_user_name_key UNIQUE (user_name)
)

删除表时序列会随之一起删除

附:修改已有表主键为自增

已有表结构

CREATE TABLE student
(
    id   int4 PRIMARY KEY,
    name VARCHAR
);

 创建序列:代码中的1表示此主键从1开始,注意:如果项目中的表已经有数据,那么START 后边的数字一定要比数据库中的主键字段的最大值要大或者相同

CREATE SEQUENCE student_id_seq START 1;

修改主键默认值

ALTER TABLE student
    ALTER COLUMN id SET DEFAULT nextval('student_id_seq'::regclass);

总结

到此这篇关于PostgreSQL中实现自增的三种方式的文章就介绍到这了,更多相关PostgreSQL实现自增方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Postgresql数据库中的json类型字段使用示例详解

    Postgresql数据库中的json类型字段使用示例详解

    JSON的主要用于在服务器与web应用之间传输数据,这篇文章主要介绍了Postgresql数据库中的json类型字段使用,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • PostgreSQL 性能优化之服务器参数配置操作

    PostgreSQL 性能优化之服务器参数配置操作

    这篇文章主要介绍了PostgreSQL 性能优化之服务器参数配置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql处理空值NULL与替换的问题解决办法

    postgresql处理空值NULL与替换的问题解决办法

    由于在不同的语言中对空值的处理方式不同,因此常常会对空值产生一些混淆,下面这篇文章主要给大家介绍了关于postgresql处理空值NULL与替换的问题解决办法,需要的朋友可以参考下
    2024-02-02
  • postgresql 中position函数的性能详解

    postgresql 中position函数的性能详解

    这篇文章主要介绍了postgresql 中position函数的性能详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • postgresql 实现查询某时间区间的所有日期案例

    postgresql 实现查询某时间区间的所有日期案例

    这篇文章主要介绍了postgresql 实现查询某时间区间的所有日期案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgresql和mysql的区别及说明

    Postgresql和mysql的区别及说明

    这篇文章主要介绍了Postgresql和mysql的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Postgresql的日志配置教程详解

    Postgresql的日志配置教程详解

    这篇文章主要介绍了Postgresql的日志配置教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • postgresql修改自增序列操作

    postgresql修改自增序列操作

    这篇文章主要介绍了postgresql修改自增序列操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 用PostgreSQL数据库做地理位置app应用

    用PostgreSQL数据库做地理位置app应用

    项目中用到了postgreSQL中的earthdistance()函数功能计算地球上两点之间的距离,中文的资料太少了,我找到了一篇 英文的、讲的很好的文章,特此翻译,希望能够帮助到以后用到earthdistance的同学
    2014-03-03
  • Postgresql设置远程访问的方法(需要设置防火墙或者关闭防火墙)

    Postgresql设置远程访问的方法(需要设置防火墙或者关闭防火墙)

    这篇文章主要介绍了Postgresql设置远程访问的方法(需要设置防火墙或者关闭防火墙),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论