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

2024-04-18 0 588
目录
  • PG中实现自增字段的三种方式:
  • 1.1 标识列 (IDENTITY)
    • 示例
    • 原理
  • 1.2 序列 (SEQUENCE)
    • 示例
  • 1.3 Serial
    • 示例
    • 原理
  • 附:修改已有表主键为自增
    • 总结

      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实现自增方式内容请搜索悠久资源以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源!

      收藏 (0) 打赏

      感谢您的支持,我会继续努力的!

      打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
      点赞 (0)

      悠久资源 PostgreSQL PostgreSQL中实现自增的三种方式举例 https://www.u-9.cn/database/postgresql/186606.html

      常见问题

      相关文章

      发表评论
      暂无评论
      官方客服团队

      为您解决烦忧 - 24小时在线 专业服务