Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4183975
  • 博文数量: 240
  • 博客积分: 11504
  • 博客等级: 上将
  • 技术积分: 4277
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-28 14:24
文章分类

全部博文(240)

分类: Mysql/postgreSQL

2014-01-14 16:12:58

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


点击(此处)折叠或打开

  1. 先来创建一个步长为2的序列,最大值为10000,每次产生100个值。
  2. t_girl=# create sequence ytt.ytt_s1 start with 1 increment by 2 maxvalue 10000 ;
  3. CREATE SEQUENCE
  4. 创建一个测试表。
  5. t_girl=# create unlogged table ytt.tmp_3 (id int not null, log_date date);
  6. CREATE TABLE
  7. 改变表tmp_3的列id 默认值是序列ytt_s1的下一个值。
  8. t_girl=# alter table tmp_3 alter id set default nextval('ytt_s1');
  9. ALTER TABLE
  10. t_girl=# \d tmp_3
  11.                    Unlogged table "ytt.tmp_3"
  12.   Column | Type | Modifiers
  13. ----------+---------+----------------------------------------------
  14.  id | integer | not null default nextval('ytt_s1'::regclass)
  15.  log_date | date


  16.  OK,我们试着插入几条记录。
  17. t_girl=# insert into tmp_3(log_date) select generate_series('2014-01-01'::timestamp,now(),'1 day');
  18. INSERT 0 14
  19. t_girl=# select * from tmp_3;
  20.  id | log_date
  21. ----+------------
  22.   1 | 2014-01-01
  23.   3 | 2014-01-02
  24.   5 | 2014-01-03
  25.   7 | 2014-01-04
  26.   9 | 2014-01-05
  27.  11 | 2014-01-06
  28.  13 | 2014-01-07
  29.  15 | 2014-01-08
  30.  17 | 2014-01-09
  31.  19 | 2014-01-10
  32.  21 | 2014-01-11
  33.  23 | 2014-01-12
  34.  25 | 2014-01-13
  35.  27 | 2014-01-14
  36. (14 rows)




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



点击(此处)折叠或打开

  1. 我们先重置原来ID的默认值。
  2. t_girl=# alter table tmp_3 alter id set default 0;
  3. ALTER TABLE


  4. 清空测试表:
  5. t_girl=# truncate table tmp_3;
  6. TRUNCATE TABLE
  7. 现在的序列已经增长到了27,如下
  8. t_girl=# \d ytt_s1;
  9.      Sequence "ytt.ytt_s1"
  10.     Column | Type | Value
  11. ---------------+---------+--------
  12.  sequence_name | name | ytt_s1
  13.  last_value | bigint | 27
  14.  start_value | bigint | 1
  15.  increment_by | bigint | 2
  16.  max_value | bigint | 10000
  17.  min_value | bigint | 1
  18.  cache_value | bigint | 1
  19.  log_cnt | bigint | 19
  20.  is_cycled | boolean | f
  21.  is_called | boolean | t


  22.  现在重置下序列。
  23.  t_girl=# alter sequence ytt_s1 restart with 1;
  24. ALTER SEQUENCE
  25. t_girl=# \d ytt_s1
  26.      Sequence "ytt.ytt_s1"
  27.     Column | Type | Value
  28. ---------------+---------+--------
  29.  sequence_name | name | ytt_s1
  30.  last_value | bigint | 1
  31.  start_value | bigint | 1
  32.  increment_by | bigint | 2
  33.  max_value | bigint | 10000
  34.  min_value | bigint | 1
  35.  cache_value | bigint | 1
  36.  log_cnt | bigint | 0
  37.  is_cycled | boolean | f
  38.  is_called | boolean | f


  39. 创建一个触发器函数。
  40. create or replace function sp_increment_tmp_3()
  41. returns trigger as
  42. $ytt$
  43. begin
  44.   new.id := nextval('ytt_s1');
  45.   return new;
  46. end;
  47. $ytt$ language plpgsql;


  48. 创建触发器。
  49. create trigger tr_insert_tmp_3
  50. before insert on ytt.tmp_3
  51. for each row
  52.   execute procedure sp_increment_tmp_3();


  53.   OK。 再次插入后,看看结果如何。
  54. t_girl=# insert into tmp_3(log_date) select generate_series('2014-01-01'::timestamp,now(),'1 day');
  55. INSERT 0 14
  56. t_girl=# select * from tmp_3;
  57.  id | log_date
  58. ----+------------
  59.   1 | 2014-01-01
  60.   3 | 2014-01-02
  61.   5 | 2014-01-03
  62.   7 | 2014-01-04
  63.   9 | 2014-01-05
  64.  11 | 2014-01-06
  65.  13 | 2014-01-07
  66.  15 | 2014-01-08
  67.  17 | 2014-01-09
  68.  19 | 2014-01-10
  69.  21 | 2014-01-11
  70.  23 | 2014-01-12
  71.  25 | 2014-01-13
  72.  27 | 2014-01-14
  73. (14 rows)



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



点击(此处)折叠或打开

  1. 现在呢,删掉之前的触发器和触发器函数。然后创建一张新表。
  2. 看看下面,跟第一种是一样的,只不过是系统自己创建了一个序列。
  3.  t_girl=# create unlogged table ytt.tmp_3 (id smallserial not null, log_date date);
  4. CREATE TABLE
  5. t_girl=# \d tmp_3;
  6.                         Unlogged table "ytt.tmp_3"
  7.   Column | Type | Modifiers
  8. ----------+----------+----------------------------------------------------
  9.  id | smallint | not null default nextval('tmp_3_id_seq'::regclass)
  10.  log_date | date |


  11. t_girl=# \d tmp_3_id_seq
  12.           Sequence "ytt.tmp_3_id_seq"
  13.     Column | Type | Value
  14. ---------------+---------+---------------------
  15.  sequence_name | name | tmp_3_id_seq
  16.  last_value | bigint | 1
  17.  start_value | bigint | 1
  18.  increment_by | bigint | 1
  19.  max_value | bigint | 9223372036854775807
  20.  min_value | bigint | 1
  21.  cache_value | bigint | 1
  22.  log_cnt | bigint | 0
  23.  is_cycled | boolean | f
  24.  is_called | boolean | f
  25. Owned by: ytt.tmp_3.id


阅读(7836) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

osdba2014-07-08 17:26:20

PostgreSQL已经有类型serial和 bigserial,直接用就可以了,不需要这么麻烦了。