PostgreSQL之sequence

转载来自:http://blog.chinaunix.net/uid-24774106-id-3973781.html


sequence 是一种特殊的数据库对象,用来产生独一无二的数字ID。Postgres中有一种数据类型serial,和sequence对应:

如果我们插入一笔记录,我们希望系统自动为我们分配一个ID,那么我们需要使用serial type。如果我们创建表的时候,自动创建一个serial类型(包smallserial and bigserial),系统会自动帮我们创建sequence这种数据库对象。

  1. createtableemploy(
  2. id serial,
  3. namevarchar(64),
  4. department)
  5. ;
manu_db=# create table employ(id serial,name varchar(64),department varchar(128)) ;
NOTICE: CREATE TABLE will create implicit sequence "employ_id_seq" for serial column "employ.id"
CREATE TABLE
manu_db=# \d
List of relations
Schema | Name | Type | Owner
--------+---------------+----------+-------
public | employ | table | manu
public | employ_id_seq | sequence | manu
(2 rows)
  • manu_db-# \d employ
    Table "public.employ"
    Column | Type | Modifiers
    ------------+------------------------+-----------------------------------------------------
    id | integer | not null default nextval('employ_id_seq'::regclass)
    name | character varying(64) |
    department | character varying(128) |


  • 我们看到,postgres自动帮助我们创建了一个sequence,命名原则是tablename_columnname_seq.
    下面这两条sql,本质是相等:
    CREATETABLEemploy(
  • id serial;

  • -----------------------------------------------------------------
  • SEQUENCEemploy_id_seq;
  • (
  • idintegerNOTNULLDEFAULTnextval('employ_id_seq';

  • ALTERSEQUENCEemploy_id_seq OWNEDbyemploy.id;
  • 我们看到,我们用了integer数据类型和serial对应起来,认用nextal(‘employ_id_seq’)给integer类型的id赋值,那是因为integer范围要比serial的范围大,这样做是安全的。对于bigserial,我们应该用bigint类型,对于smallserial应该何smallint对应。

    我们建立数据表和sequence的对应关系,常规的就是这两种方法,要么创建表的时候,某字段是serial类型,要么创建先创建sequence,然后创建表的时候,将某字段和sequence 联系起来(DEFAULT nextvl(‘XXXX_seq’)),有没有第三种方法?假如创建表的时候,没有用DEFAULT nextval建立起来联系,还有没有机会在后面建立这种联系?我为什么纠结这个?
  • manu_db=# create table employ_copy (like employ) ;
    CREATE TABLE
    manu_db=# \d employ_copy
    Table "public.employ_copy"
    Column | Type | Modifiers
    ------------+------------------------+-----------
    id | integer | not null
    name | character varying(64) |
    department | character varying(128) |


    manu_db=# \d employ
    Table "public.employ"
    Column | Type | Modifiers
    ------------+------------------------+-----------------------------------------------------
    id | integer | not null default nextval('employ_id_seq'::regclass)
    name | character varying(64) |
    department | character varying(128) |


    manu_db=#

  • 如果业务需要,创建一个schema和employ一模一样的table,我们只能够用like,但是,我们看到,id这个字段并不完全一样,原因就是没有sequence和新建的table对应。这种情况,我们有没有办法, 事后创建sequence,建立table中id字段的联系, I mean id use nextval as default?
    答案是肯定的:
    SEQUENCEemploy_copy_id_seq;
  • TABLEemploy_copyCOLUMNidSET'employ_copy_id_seq';
  • ALTER SEQUENCE employ_copy_id_seq OWNED by employ_copy.id ;
  • 看看效果
  • manu_db=# CREATE SEQUENCE employ_copy_id_seq ;
    CREATE SEQUENCE
    manu_db=# ALTER TABLE employ_copy ALTER COLUMN id SET DEFAULT nextval('employ_copy_id_seq');
    ALTER TABLE
    manu_db=# \d employ_copy
    Table "public.employ_copy"
    Column | Type | Modifiers
    ------------+------------------------+----------------------------------------------------------
    id | integer |not null default nextval('employ_copy_id_seq'::regclass)
    name | character varying(64) |
    department | character varying(128) |


  • 注意,加了alter sequence owned by,在删除table的时候,会自动的将sequence删掉。如果不建立这种owned by的关系,删除table,不会引发sequence被删除。我就不贴了,可以自己try。

    当我们向Postgres插入一笔记录的时候,我们不需要费力告诉DB id的值,因为DB会自动分配一个数值给id:
    manu_db=# insert into employ (name,department) values('bean','DDI');
    INSERT 0 1
    manu_db=# insert into employ (name,department) values('albert','DDI');
    INSERT 0 1
    manu_db=# select * from employ ;
    id | name | department
    ----+--------+------------
    1| bean | DDI
    2| albert | DDI
    (2 rows)

  • 我们可以用currval 和 nextval取到sequence的当前值和下一个值。注意,currval是不会改变sequence的,但是nextval一旦使用,下个数字就被消耗掉了,哪怕你并没有真正的用于你的table。
    manu_db=#select currval;
  • currval
  • --
  • 2
  • (1 row)

  • manu_db#select nextval;
  • nextval
  • -
  • 3
  • -
  • 4
  • )
  • 使用setval可以设置下一个当前值,下一次就会从你设置的这个值开始递增:
    #select setval;
  • setval
  • -
  • 100
  • ;
  • currval
  • -
  • 101
  • )
  • 参考文献 1A Tour of Postgresql Data Types 2 Postgres manual 9.1

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果是个PostGreSQL的数据,于是装数据库,但这个也不懂呀,而且本系统用的Oracle,于是得解决迁移转换的问题。 总结下来两个思路。1、PostgresToOracle多金的
    本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么查看PostgreSQL数据库中所有表”文章能帮助大...
    错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正确。  pg_hba.conf文件在Postgre安装文件目录下的data文件夹中。解决方案1、进入到data目录下,找到pg_hba.conf文件
    因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本地localhost访问正常,在相同网段的远程机器访问报如下错误
    wamp 环境 这个提示就是说你的版本低于10了。 先打印php_info(),查看自己的版本(我这边是已经处理后的,之前的忘记截图了)
    psycopg2.OperationalError: SSL SYSCALL error: EOF detected 问题提示:exception psycopg2.OperationalError
    项目 postgres 连接不上, 所有连接报错 :psql: FATAL: sorry, too many clients already问题原由程序使用连接未及时释放, 连接一直处于 idle 状态处理方式1、 程序里面未释放的连接, 在使用后及时释放
    服务器在同一个数据目录上启动了两个PostgreSQL实例(它已经删除postmaster.pid并使用了新的端口号,因此绕过了这种行为的正常保护措施被绕过),导致PostgreSQL的误操作postgresql 报错 FATAL: the database system is
    问题原因:数据库崩溃,内存不足造成 或者 数据已损坏,磁盘故障造成首先介绍一下背景,在测试Deepgreen(Greenplum升级版)数据库时,pgbench并发数设置过多,导致数据库卡死了,在进行连接、重启、关闭时,都报同样
    第 11 届 PostgreSQL 中国技术大会于 2022 年 1 月 7 日至 9 日在武汉光谷会展酒店成功举办。作为 PostgreSQL 技术领域的年度盛事,postgreSQL 中文社区旨在搭建开放、合作共享的平台,基于开源,创新驱动,共同探讨数据库行业数字化发展方向和未来新机遇。
    即将到来的 PostgreSQL 15 已经确认会增加 MERGE 语句,MERGE 可以在单个语句中实现 INSERT、UPDATE 以及 DELETE 操作。在此之前,我们可以使用 INSERT … ON CONFLICT DO …. 语句代替该功能。
    本文介绍了PostgreSQL 访问和操作 MySQL 数据库的外部数据包装器:mysql_fdw。mysql_fdw 提供了读写 MySQL 外部表、连接池、WHERE 条件下推、返回字段下推、预编译语句、JOIN 下推、聚合函数(min、max、sum、avg、count)下推、ORDER BY 下推以及 LIMIT OFFSET 下推等功能。
    本文给大家分享了一些 PostgreSQL 实用小技巧。
    PostgreSQL 全球开发组于 2021-05-20 发布了 PostgreSQL 14 的第一个 beta 版本。本文介绍了该版本中的主要新特性和增强功能,包括性能、新的 multirange 类型、SQL 语句、管理、复制和恢复、安全以及其他方面。
    本文介绍了 PostgreSQL 横向子查询(LATERAL)的语法的作用。SELECT 就像一个循环语句,而 LATERAL 就像是一个嵌套循环语句,对于左侧表中的每行记录执行一次子查询操作。
    PostgreSQL 15 增加了大量符合 SQL/JSON 标准的函数,使得 JSON 数据的处理更加简单。
    PostgreSQL 支持多个不同级别的灵活加密技术,包括密码加密、字段加密、存储加密、传输加密、认证加密以及应用加密,可以保护数据不因数据库服务器被盗、内部管理员或者不安全的网络传输而导致泄露。
    目录1.编译incubator-datasketches-cpp编译datasketches-cpp项目编译datasketches-cpp项目的PythonWrapperforDatasketches2.编译incubator-datasketches-postgresql3.Verifyinginstallationofdatasketches-postgresqlwithatestdatabase4.AdvancedExamplesofdata
    连接pg需要指定以下的参数:·主机地址·端口·数据库名·用户·密码 如果没有指定上面的参数的话,pg会从环境变量中寻找以下的变量值:·PGHOST或PGHOSTADDR·PGPORT·PGDATABASE·PGUSER·PGPASSWORD 如果只是指定了前面四个参数,pg会尝试寻找口令文件。
    pg库也是常用的数据库之一,有些刚开始接触开发的老师可能不熟,这里简单介绍一下,总体使用方法和mysql类似,所以这里只讲配置方法。这个地方test1是数据库1,test2是数据库2,yml文件一定要主要好格式,建议用properties。MyBaitsSqlSessionFactory配置文件。不同数据源的dao层要放到对应文件夹下。TimedConfig配置文件。文件夹格式,这里直接放贴图。Bd3Config配置文件。下面是数据源的配置文件。