首页 > 数据库 >PostgreSQL Serial

PostgreSQL Serial

时间:2023-09-25 22:33:08浏览次数:50  
标签:PostgreSQL name id course fruits Serial serial apple

概念描述

PostgreSQL中的SERIAL是一种特殊的类型,用于创建自增长的整数列,通常用作表的主键或其他需要唯一标识的列。SERIAL实际上不是真正的类型,而是一种便捷的写法,它会自动创建一个SEQUENCE对象,并将该SEQUENCE的下一个值作为该列的默认值。

  • PostgreSQL SERIAL是一种特殊的用于生产整数序列数据库对象
  • serial通常用于主键列,与mysql的AUTO_INCREMENT 概念类似。创建表时使用serial伪类型定义序列
  • 当serial绑定的字段与表被删除时,serial自动被删除

测试验证

语法:

CREATE TABLE table_name(
   id SERIAL
   );

#创建一个表,将serial赋值伪类型给id列,PostgreSQL将执行下列步骤
1.创建serial对象并设置下一个生成值作为列的缺省值
2.给对应列增加NOT NULL约束,因为serial总是生成一个整数值,不能为null值
3.赋值serial的拥有者给id列,因此当id列或表被删除时,serial对象自动被删除

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

PostgreSQL Serial_AUTO_INCREMENT

PostgresQL SERIAL示例:

#特别需要注意的是,serial列不会隐式在列上创建索引或是该列为主键列。当然可以很容易使用PRIMARY KEY关键字增加相应约束。
#下面语句创建fruits表,其中id类是serial类型

例:
CREATE TABLE fruits(
   id SERIAL PRIMARY KEY,
   name VARCHAR NOT NULL
);


#创建serial后会单独存在
course=# \d fruits
                                 Table "public.fruits"
 Column |       Type        | Collation | Nullable |              Default
--------+-------------------+-----------+----------+------------------------------------
 id     | integer           |           | not null | nextval('fruits_id_seq'::regclass)
 name   | character varying |           | not null |
Indexes:
    "fruits_pkey" PRIMARY KEY, btree (id)

#fruits表创建序列的时候会自动创建fruits_id_seq这个序列,fruits表的id字段引用这个serial
#当插入数据时会自动调用 nextval('fruits_id_seq'::regclass) 这个函数来递增id字段

PostgreSQL Serial_SEQUENCE_02

查看serial信息:

course=# \d+ fruits_id_seq
                   Sequence "public.fruits_id_seq"
  Type   | Start | Minimum |  Maximum   | Increment | Cycles? | Cache
---------+-------+---------+------------+-----------+---------+-------
 integer |     1 |       1 | 2147483647 |         1 | no      |     1
Owned by: public.fruits.id

PostgreSQL Serial_SEQUENCE_03

为serial赋值的方式:

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

例:
1.无需给serial赋值,自动赋值
INSERT INTO fruits(name) VALUES('orange');

2.使用default自动赋值
INSERT INTO fruits(id,name) VALUES(DEFAULT,'apple');

查询结果:
course=# INSERT INTO fruits(name) VALUES('orange');
INSERT 0 1
course=# INSERT INTO fruits(id,name) VALUES(DEFAULT,'apple');
INSERT 0 1
course=# select * from fruits;
 id |  name
----+--------
  1 | orange
  2 | apple

#在插入数据时无需指定,会自动递增

PostgreSQL Serial_PostgreSQL_04

注意:如果指定了值插入id字段则不会调用nextval函数,在之后使用序列的方式插入数据则会按照serial的上一个值进行递增,不会按照指定插入的值进行递增

course=# INSERT INTO fruits(id,name) VALUES(5,'apple');
INSERT 0 1
course=# select * from fruits;
 id |  name  
----+--------
  1 | orange
  2 | apple
  5 | apple
(3 rows)

course=# INSERT INTO fruits(id,name) VALUES(DEFAULT,'apple');
INSERT 0 1
course=# select * from fruits;
 id |  name  
----+--------
  1 | orange
  2 | apple
  5 | apple
  3 | apple
(4 rows)

PostgreSQL Serial_serial_05

查询serial的当前值/下一个值:

#查询当前serial的值
course=# select currval('fruits_id_seq');
 currval 
---------
       3
(1 row)

#查询下一个值
course=# select nextval('fruits_id_seq');
 nextval 
---------
       4
(1 row)

更新serial的起始值:

语法:
    alter sequence serial名称 restart with 7
#更新序列的起始值从7号开始    

例:
course=# alter sequence fruits_id_seq restart with 4;
course=# INSERT INTO fruits(id,name) VALUES(DEFAULT,'apple');
INSERT 0 1
course=# select * from fruits;
 id |  name  
----+--------
  1 | orange
  2 | apple
  5 | apple
  4 | apple
(4 rows)

#第二种方式(设置serial的起始值为8,从8开始)
course=# select setval('fruits_id_seq',8,false);
 setval 
--------
      8
(1 row)

#更新serial的起始值为5,从6开始
course=# select setval('fruits_id_seq',5);
 setval 
--------
      5
(1 row)

PostgreSQL Serial_SEQUENCE_06

获取serial的名称(pg_get_serial_sequence):

#通过表名和绑定serial的字段来获取序列的名称
语法:
    pg_get_serial_sequence('table_name','column_name')

获取serial最近生成的值:

语法:
    SELECT currval(pg_get_serial_sequence('table_name', 'column_name'));

course=# SELECT currval(pg_get_serial_sequence('fruits', 'id'));
 currval 
---------
       3
       
#指定serial名称查询
course=# select currval('fruits_id_seq');
 currval 
---------
       3

参考文档

http://postgres.cn/v2/release/v/59

https://www.cnblogs.com/alianbog/p/5654604.html

标签:PostgreSQL,name,id,course,fruits,Serial,serial,apple
From: https://blog.51cto.com/u_13482808/7600228

相关文章

  • requests 响应头部转json时报错TypeError: Object of type CaseInsensitiveDict is n
    前言requests响应头部在转json时,想格式化输出,结果报错TypeError:ObjectoftypeCaseInsensitiveDictisnotJSONserializable报错详情示例代码importrequestsimportjson#上海悠悠wx:283340479#blog:https://www.cnblogs.com/yoyoketang/r=requests.get('htt......
  • PostgreSQL教程:备份与恢复(物理备份、物理恢复)
    物理备份(归档+物理)这里需要基于前面的文件系统的备份和归档备份实现最终的操作单独使用文件系统的方式,不推荐毕竟数据会丢失。这里直接上PostgreSQL提供的pg_basebackup命令来实现。pg_basebackup会做两个事情、会将内存中的脏数据落到磁盘中,然后将数据全部备份会将wal日志直接做归......
  • PostgreSQL教程:事务的ACID特性及基本使用
    什么是ACID?在日常操作中,对于一组相关操作,通常要求要么都成功,要么都失败。在关系型数据库中,称这一组操作为事务。为了保证整体事务的安全性,有ACID这一说:原子性A:事务是一个最小的执行单位,一次事务中的操作要么都成功,要么都失败。一致性C:在事务完成时,所有数据必须保持在一致的状态。(事......
  • PostgreSQL教程:触发器
    触发器Trigger,是由事件触发的一种存储过程当对标进行insert,update,delete,truncate操作时,会触发表的Trigger(看触发器的创建时指定的事件)构建两张表,学生信息表,学生分数表。在删除学生信息的同时,自动删除学生的分数。先构建表信息,填充数据createtablestudent(idint,namev......
  • PostgreSQL教程:约束(主键、非空、唯一、检查约束)
    核心在于构建表时,要指定上一些约束。约束主键--主键约束droptabletest;createtabletest(idbigserialprimarykey,namevarchar(32));非空--非空约束droptabletest;createtabletest(idbigserialprimarykey,namevarchar(32)notnull);......
  • PostgreSQL教程:数组类型
    数组还是要依赖其他类型,比如在设置住址,住址可能有多个住址,可以采用数组类型去修饰字符串。PGSQL中,指定数组的方式就是[],可以指定一维数组,也支持二维甚至更多维数组。构建数组的方式:droptabletest;createtabletest(idserial,col1int[],col2int[2],col3......
  • PostgreSQL教程:JSON&JSONB类型
    JSON在MySQL8.x中也做了支持,但是MySQL支持的不好,因为JSON类型做查询时,基本无法给JSON字段做索引。PGSQL支持JSON类型以及JSONB类型。JSON和JSONB的使用基本没区别。撇去JSON类型,本质上JSON格式就是一个字符串,比如MySQL5.7不支持JSON的情况的下,使用text也可以,但是字符串类型无法校验......
  • PostgreSQL教程:IP类型cidr
    PGSQL支持IP类型的存储,支持IPv4,IPv6这种,甚至Mac内种诡异类型也支持这种IP类型,可以在存储IP时,帮助做校验,其次也可以针对IP做范围查找。IP校验的效果IP也支持范围查找。......
  • PostgreSQL教程:枚举类型
    枚举类型MySQL也支持,只是没怎么用,PGSQL同样支持这种数据类型可以声明枚举类型作为表中的字段类型,这样可以无形的给表字段追加诡异的规范。--声明一个星期的枚举,值自然只有周一~周日。createtypeweekasenum('Mon','Tues','Sun');--声明一张表,表中的某个字段的类型是上面声......
  • PostgreSQL教程:日期类型
    在PGSQL中,核心的时间类型,就三个。timestamp(时间戳,覆盖年月日时分秒)date(年月日)time(时分秒)在PGSQL中,声明时间的方式。只需要使用字符串正常的编写yyyy-MM-ddHH:mm:ss就可以转换为时间类型。直接在字符串位置使用之前讲到的数据类型转换就可以了。当前系统时间:-可以使用now作为......