博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】 PostgreSQL 实现MySQL 的auto_increment 字段
阅读量:6114 次
发布时间:2019-06-21

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

hot3.png

MySQL 里面有auto_increment 自增字段,PostgreSQL 没有自增字段这一说法,但是有单独的对象:序列。 我们可以用序列或者其他土方法来是实现这样的语法。

1. 用序列来实现

先来创建一个步长为2的序列,最大值为10000,每次产生100个值。t_girl=# create sequence ytt.ytt_s1 start with 1 increment by 2  maxvalue 10000 ;CREATE SEQUENCE创建一个测试表。t_girl=# create unlogged table ytt.tmp_3 (id int not null, log_date date);                      CREATE TABLE改变表tmp_3的列id 默认值是序列ytt_s1的下一个值。t_girl=# alter table tmp_3 alter id set default nextval('ytt_s1');ALTER TABLEt_girl=# \d tmp_3                   Unlogged table "ytt.tmp_3"  Column  |  Type   |                  Modifiers                  ----------+---------+---------------------------------------------- id       | integer | not null default nextval('ytt_s1'::regclass) log_date | date  OK,我们试着插入几条记录。t_girl=# insert into tmp_3(log_date) select generate_series('2014-01-01'::timestamp,now(),'1 day');INSERT 0 14t_girl=# select * from tmp_3; id |  log_date ----+------------  1 | 2014-01-01  3 | 2014-01-02  5 | 2014-01-03  7 | 2014-01-04  9 | 2014-01-05 11 | 2014-01-06 13 | 2014-01-07 15 | 2014-01-08 17 | 2014-01-09 19 | 2014-01-10 21 | 2014-01-11 23 | 2014-01-12 25 | 2014-01-13 27 | 2014-01-14(14 rows)

2. 同样是用序列,但是在原表上添加了触发器。

我们先重置原来ID的默认值。t_girl=# alter table tmp_3 alter id set default 0;ALTER TABLE清空测试表:t_girl=# truncate table tmp_3;TRUNCATE TABLE现在的序列已经增长到了27,如下t_girl=# \d ytt_s1;     Sequence "ytt.ytt_s1"    Column     |  Type   | Value ---------------+---------+-------- sequence_name | name    | ytt_s1 last_value    | bigint  | 27 start_value   | bigint  | 1 increment_by  | bigint  | 2 max_value     | bigint  | 10000 min_value     | bigint  | 1 cache_value   | bigint  | 1 log_cnt       | bigint  | 19 is_cycled     | boolean | f is_called     | boolean | t 现在重置下序列。 t_girl=# alter sequence ytt_s1 restart with 1;ALTER SEQUENCEt_girl=# \d ytt_s1     Sequence "ytt.ytt_s1"    Column     |  Type   | Value ---------------+---------+-------- sequence_name | name    | ytt_s1 last_value    | bigint  | 1 start_value   | bigint  | 1 increment_by  | bigint  | 2 max_value     | bigint  | 10000 min_value     | bigint  | 1 cache_value   | bigint  | 1 log_cnt       | bigint  | 0 is_cycled     | boolean | f is_called     | boolean | f创建一个触发器函数。create or replace function sp_increment_tmp_3()returns trigger as$ytt$begin  new.id := nextval('ytt_s1');  return new;end;$ytt$ language plpgsql;创建触发器。create  trigger tr_insert_tmp_3before insert on ytt.tmp_3for each row    execute procedure sp_increment_tmp_3();  OK。 再次插入后,看看结果如何。t_girl=# insert into tmp_3(log_date) select generate_series('2014-01-01'::timestamp,now(),'1 day');INSERT 0 14t_girl=# select * from tmp_3; id |  log_date ----+------------  1 | 2014-01-01  3 | 2014-01-02  5 | 2014-01-03  7 | 2014-01-04  9 | 2014-01-05 11 | 2014-01-06 13 | 2014-01-07 15 | 2014-01-08 17 | 2014-01-09 19 | 2014-01-10 21 | 2014-01-11 23 | 2014-01-12 25 | 2014-01-13 27 | 2014-01-14(14 rows)

3. 其实也是用序列实现,但是有系统提供的类型serial(其实也就是默认的一个序列)。

现在呢,删掉之前的触发器和触发器函数。然后创建一张新表。看看下面,跟第一种是一样的,只不过是系统自己创建了一个序列。 t_girl=# create unlogged table ytt.tmp_3 (id smallserial not null, log_date date);          CREATE TABLEt_girl=# \d tmp_3;                        Unlogged table "ytt.tmp_3"  Column  |   Type   |                     Modifiers                     ----------+----------+---------------------------------------------------- id       | smallint | not null default nextval('tmp_3_id_seq'::regclass) log_date | date     |t_girl=# \d tmp_3_id_seq          Sequence "ytt.tmp_3_id_seq"    Column     |  Type   |        Value       ---------------+---------+--------------------- sequence_name | name    | tmp_3_id_seq last_value    | bigint  | 1 start_value   | bigint  | 1 increment_by  | bigint  | 1 max_value     | bigint  | 9223372036854775807 min_value     | bigint  | 1 cache_value   | bigint  | 1 log_cnt       | bigint  | 0 is_cycled     | boolean | f is_called     | boolean | fOwned by: ytt.tmp_3.id

本文出自 “” 博客,请务必保留此出处

转载于:https://my.oschina.net/u/585111/blog/219461

你可能感兴趣的文章
Oracle中drop user和drop user cascade的区别
查看>>
【Linux】linux经常使用基本命令
查看>>
Java 内存区域和GC机制
查看>>
更新代码和工具,组织起来,提供所有博文(C++,2014.09)
查看>>
HTML模块化:使用HTML5 Boilerplate模板
查看>>
登记申请汇总
查看>>
Google最新截屏案例详解
查看>>
2015第31周一
查看>>
2015第31周日
查看>>
在使用EF开发时候,遇到 using 语句中使用的类型必须可隐式转换为“System.IDisposable“ 这个问题。...
查看>>
PHP使用DES进行加密和解密
查看>>
Oracle 如何提交手册Cluster Table事务
查看>>
BeagleBone Black第八课板:建立Eclipse编程环境
查看>>
在服务器上用Fiddler抓取HTTPS流量
查看>>
文件类似的推理 -- 超级本征值(super feature)
查看>>
【XCode7+iOS9】http网路连接请求、MKPinAnnotationView自定义图片和BitCode相关错误--备用...
查看>>
各大公司容器云的技术栈对比
查看>>
记一次eclipse无法启动的排查过程
查看>>
【转】jmeter 进行java request测试
查看>>
读书笔记--MapReduce 适用场景 及 常见应用
查看>>