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)

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

PostgreSQL SERIAL创建自增列的更多相关文章

  1. postgres serial创建自增列

    Sequence是数据库中一类特殊的对象,其用于生成唯一数字标识符.一个典型的应用场景就是手动生成一系列主键.Sequence和MySQL中的AUTO_INCREMENT的概念很像. 创建序列Sequ ...

  2. Oracle12c:支持通过创建identity columen来实现创建自增列

    oracle12c之前如果需要创建自增列必须要通过sequence+trigger来实现.但是oracle12c已经可以像mysql,sqlserver一样通过identity column来设置自增 ...

  3. 【postgresql】创建自增SEQUENCE

    CREATE SEQUENCE circlefence_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; alte ...

  4. c# Mongodb创建自增列

    MongoCollection<BsonDocument> tblCount; if (!db.CollectionExists(tblCountName))            {   ...

  5. Oracle自增列创建方法

    最近在做Oracle的项目,由于以前没有接触过Oracle的开发,遇到了不少的问题,比如给Oracle表添加自增列,与SQL Server就不同. Oracle没有自增字段这样的功能,但是通过触发器( ...

  6. oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)

    0   前言 用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列. 查阅资料后发现 Oracle 的自增列需要手动编写. ...

  7. sqlite3创建自增主键,以及清空表使自增列归零

    1.创建自增主键 CREATE TABLE tb_python (ID INTEGER PRIMARY KEY AUTOINCREMENT,TITLE TEXT,URL TEXT); 2.清空表 SQ ...

  8. SQL Server 2008 R2——使用计算列为表创建自定义的自增列

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  9. mssql 获取自增列起始及增量

    --首先创建一个表 CREATE TABLE [dbo].[abcd]( ,) NOT NULL, ) NULL, ) NULL ) ON [PRIMARY] --获取起始值 SELECT IDENT ...

随机推荐

  1. 关于qemu的二三事(1)————qemu的特殊参数之monitor

    qemu作为一个十分重要的虚拟化工具,提供了丰富的功能/参数来支持虚拟化的各种操作. 下面仅就monitor这个参数或者说是功能来结合自己的实际体验来做个简要介绍. 如何进入qemu的monitor模 ...

  2. [转]小D课堂 - 零基础入门SpringBoot2.X到实战_汇总

    原文地址:https://www.cnblogs.com/wangjunwei/p/11392825.html 第1节零基础快速入门SpringBoot2.0 小D课堂 - 零基础入门SpringBo ...

  3. kafka集群部署以及单机部署

      kafka单机部署 一.环境准备 当前环境:centos7.3一台软件版本:kafka_2.12部署目录:/usr/local/kafka启动端口:9092配置文件:/usr/local/kafk ...

  4. 这42个Python小例子,太走心

    告别枯燥,60秒学会一个Python小例子.奔着此出发点,我在过去1个月,将平时经常使用的代码段换为小例子,分享出来后受到大家的喜欢. 一.基本操作 1 链式比较 i = 3print(1 <  ...

  5. SpringBoot MAVEN编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:

    参考了好几篇文章没搞定,直到查询错误关键字 An unknown compilation problem occurred 分别参考了以下博客: https://blog.csdn.net/fanre ...

  6. 百度分享实现https

    什么是百度分享,看下面两个图. 还要自己写js,css吗?那不存在的,百度已经给出了解决方案并分享了出来 http://share.baidu.com/code/advance 缺陷是不支持 http ...

  7. [LeetCode] 290. Word Pattern 单词模式

    Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...

  8. [LeetCode] 803. Bricks Falling When Hit 打击砖块掉落

    We have a grid of 1s and 0s; the 1s in a cell represent bricks.  A brick will not drop if and only i ...

  9. OpenJudge 2755:神奇的口袋

    总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体 ...

  10. 【剑指offer】面试题 6. 从尾到头打印链表

    面试题 6. 从尾到头打印链表 NowCoder 题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值. Java 实现 ListNode Class class ListNode { i ...