博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
postgresql数据类型之Serial
阅读量:6860 次
发布时间:2019-06-26

本文共 2914 字,大约阅读时间需要 9 分钟。

hot3.png

概述

一般来说,每一个都需要一个主键,主键的值一般是通过数据库的auto_increment或者使用插入sequence来保证每条记录分配唯一的值.

Oracle在12c中实现了表中序列的auto_increment,12c之前只能通过trigger来自己实现.
PG中有个数据类型serial.

创建带serial的表

创建和使用

db01=# create table t_t3(id serial,name varchar(30));CREATE TABLEdb01=# insert into t_t3(name) values('aaa');INSERT 0 1db01=# insert into t_t3(name) values('aaa');INSERT 0 1db01=# insert into t_t3(name) select generate_series(1,10) || 'a';INSERT 0 10db01=# select * from t_t3; id | name ----+------  1 | aaa  2 | aaa...... 11 | 9a 12 | 10a(12 rows)

只需要插入id的默认值,自动会帮你生成序列号所以下面的方式也可以

也可以通过关键字default

db01=# insert into t_t3 values(default,'bbb');INSERT 0 1db01=# select * from t_t3 where name = 'bbb'; id | name ----+------ 13 | bbb(1 row)

使用了serial类型的自动,不要主动插入,否则就会主键冲突

db01=# alter table t_t3 add constraint pk_t_t3 primary key(id);ERROR:  could not create unique index "pk_t_t3"DETAIL:  Key (id)=(1) is duplicated.db01=# delete from t_t3 where name = 'a';DELETE 1db01=# alter table t_t3 add constraint pk_t_t3 primary key(id);ALTER TABLE

##serial的内部##

db01=# \ds            List of relations Schema |    Name     |   Type   | Owner --------+-------------+----------+------- hippo  | t_t3_id_seq | sequence | hippo(1 row)db01=# select currval('t_t3_id_seq'); currval ---------      13(1 row)

serial内部其实帮助我们实现了:

  1. 创建了一个sequence,名字是表名_字段名_seq
  2. 设置id字段为NOT NULL DEFAULT nextval('此sequence')
  3. 关联此sequence到相关字段.

我们自己来实现一下:

db01=# create table t4(id bigint,name varchar(30));CREATE TABLEdb01=# create sequence seq_t4 increment by 2 start 1 cache 20 owned by t4.id;CREATE SEQUENCEdb01=# select nextval('seq_t4');       1db01=# select nextval('seq_t4');       3db01=# alter table t4 alter id set not null,alter id set default nextval('seq_t4');ALTER TABLEdb01=# insert into t4(name) values('a');INSERT 0 1db01=# insert into t4(name) values('a');INSERT 0 1db01=# select * from t4;  5 | a  7 | a

删除

db01=# \ds            List of relations Schema |    Name     |   Type   | Owner --------+-------------+----------+------- hippo  | seq_t4      | sequence | hippo hippo  | t_t3_id_seq | sequence | hippo(2 rows)db01=# drop table t4;DROP TABLEdb01=# \ds            List of relations Schema |    Name     |   Type   | Owner --------+-------------+----------+------- hippo  | t_t3_id_seq | sequence | hippo(1 row)

因为这个sequence关联在表的字段上,所以删除表字段会一起删除

除非owner没有指定

补充

serial类型有3中,smallserial,serial,bigserial,底层分别对应smallint,integer,bigint,分别占2bit,4bit,8bit.

查看sequence的属性

db01=# select * from t_t3_id_seq; sequence_name | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- t_t3_id_seq   |         13 |           1 |            1 | 9223372036854775807 |         1 |           1 |      22 | f         | t(1 row)

//END

转载于:https://my.oschina.net/hippora/blog/384252

你可能感兴趣的文章
Swizzling Method
查看>>
React同构踩坑记录
查看>>
教你用Python如何实现微信自动回复功能,机器人自动对话!
查看>>
使用var定义变量和不使用的区别
查看>>
React两个bug踩坑
查看>>
vue引入mxGrpah
查看>>
合并冲突 - 每天三分钟玩转Git(三)
查看>>
你们公司今年会发年终奖吗?Python告诉你大家怎么说
查看>>
Derek解读Bytom源码-Api Server接口服务
查看>>
Java之JDK7的新语法探索
查看>>
微软大秀Windows 10中的MyOffice App免费功能
查看>>
UDP协议
查看>>
学jstl,看这一篇就够了
查看>>
Webpack之tapable深入学习(一)--Sync*Hook
查看>>
Redis 环境配置,缓存必备
查看>>
设计模式 系列记忆之 六大设计原则
查看>>
写给即将面试的你
查看>>
Android NDK开发之JNI基础
查看>>
Java程序员有话说 大专生毕业 6 年月薪 3W+:不从众也不普通
查看>>
D2 日报 2019年5月29日
查看>>