PostgreSQL SERIAL创建自增列

  本文我们介绍PostgreSQL SERIAL,并展示如何使用serial类型创建表自增列。

  PostgreSQL SERIAL伪类型

  PostgreSQL序列是一种特殊的用于生产整数序列数据库对象。序列通常用于主键列,与mysql的AUTO_INCREMENT 概念类似。创建表时使用serial伪类型定义序列:

  CREATE TABLE table_name(

  id SERIAL

  );

  赋值serial伪类型给id列,PostgreSQL将执行下列步骤:

  创建序列对象并设置下一个生成值作为列的缺省值。

  给对应列增加NOT NULL约束,因为序列总是生成一个整数值,不能为null值。

  赋值序列的拥有者给id列,因此当id列或表被删除时,序列对象自动被删除。

  对应背后执行语句:

  CREATE TABLE table_name(

  id SERIAL

  );

  相当于执行了下面语句:

  CREATE SEQUENCE table_name_id_seq;

  CREATE TABLE table_name (

  id integer NOT NULL DEFAULT nextval('table_name_id_seq')

  );

  ALTER SEQUENCE table_name_id_seq

  OWNED BY table_name.id;

  PostgreSQL 提供三种序列伪类型,分别为SMALLSERIAL, SERIAL, BIGSERIAL,对应范围如下:

  Name  Storage Size  Range

  SMALLSERIAL  2 bytes  1 to 32,767

  SERIAL  4 bytes  1 to 2,147,483,647

  BIGSERIAL  8 bytes  1 to 922,337,2036,854,775,807

  PostgresQL SERIAL示例

  特别需要注意的是,serial列不会隐式在列上创建索引或是该列为主键列。当然可以很容易使用PRIMARY KEY关键字增加相应约束。

  下面语句创建fruits表,其中id类是serial类型:

  CREATE TABLE fruits(

  id SERIAL PRIMARY KEY,

  name VARCHAR NOT NULL

  );

  在insert语句中,可以忽略对应列或使用default关键字都可以给serial赋值,请看示例:

  INSERT INTO fruits(name) VALUES('orange');

  或者: 无锡人流医院 http://www.bhnfkyy.com/

  INSERT INTO fruits(id,name) VALUES(DEFAULT,'apple');

  PostgreSQL 给fruits表中插入两行记录,id的值为1和2:

  SELECT *

  FROM fruits;

  id | name

  ----+--------

  1 | apple

  2 | orange

  (2 rows)

  使用pg_get_serial_sequence函数可以获得serial列的序列名称:

  pg_get_serial_sequence('table_name','column_name')

  通过给currval函数传入序列名称可以获得当前生成的值。举例,下面语句返回最近生成的值:

  SELECT currval(pg_get_serial_sequence('fruits', 'id'));

  返回结果:

  currval

  ---------

  2

  (1 row)

  当执行insert语句是,你想获得序列生成的值,可以在insert语句中使用RETURNING id子句实现。下面语句插入一行新的记录,并返回id列生成的值:

  INSERT INTO fruits(name) VALUES('banana')

  RETURNING id;

  结果如下:

  id

  ----

  3

  (1 row)

  序列生成器不是事务安全的。意味着如果两个并发数据库连接尝试从序列中获取下一个值,每个客户端获得不同的值。如果一个客户端回滚事务,则该序列值将被弃用,导致序列值不连续。

最新文章

  1. shell编程:定义简单标准命令集
  2. 【Python⑤】python序列---list和tuple
  3. POJ 1321 DFS
  4. SparkStreaming(源码阅读十二)
  5. 修正 Memo 設定為 ReadOnly 後, 無法有複製的功能
  6. explicit,violate,volatile,mutable小结
  7. MySQL版本调研
  8. Codeforces Round #372 (Div. 1) B. Complete The Graph (枚举+最短路)
  9. signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
  10. C语言volatile关键字
  11. Qt 读写XML文件
  12. 基于Ubuntu14.04-LTS下安装docker
  13. java对象拷贝和复制
  14. python 抓取金融数据,pandas进行数据分析并可视化系列 (一)
  15. Linxu指令--crond
  16. Spring学习之二
  17. BZOJ1173 CDQ分治 笔记
  18. Windows2008 R2 X64 PHP环境搭建步骤
  19. Android定制:修改开机启动画面
  20. [T-ARA][남주긴 아까워][给别人可惜了]

热门文章

  1. python 代码性能分析 库
  2. Oracle系列一 SQL语句基本概念和学习准备
  3. 开发人员不得不知的MySQL索引和查询优化
  4. EasyDSS高性能RTMP/FLV/HLS(m3u8)/RTSP流媒体服务器技术的HTTP QueryString URL的C++实现方案
  5. jQuery hashchange监听浏览器url变化
  6. 使用consul实现分布式服务注册和发现--redis篇
  7. Linq查询连接guid与varchar字段
  8. [转] ABP框架Web API跨域问题的解决方案
  9. libevent实现对管道的读写操作
  10. 简单的python爬虫教程:批量爬取图片