您的位置:首页 > 数据库 > Oracle

PostgreSQL: 数据迁移之序列问题(也可以使用在所有使用序列数据库上,比如Oracle)

2012-09-28 14:16 736 查看

一、问题背景:

今天在做一个OA系统,原先的数据库是Oracle的,后来改到Postgresql数据库,一开始把数据库迁移到Postgresql上来,序列和建表都通过Oracle导出的sql语句来完成,没有考虑到序列在重新创建后,会重新重初始值开始计算,让我遇到了现在的问题,新的数据无法插入。这个让我想起了以前在华为时候,一位DBA跟我说过,数据在迁移的时候一定要先check序列的问题,现在想起来确实,呵呵。

二、如何解决 数据迁移后,序列的问题

当然对于DBA来说,这个必要做的。

1、创建序列

skytf=> create sequence seq_test_1 INCREMENT by 1 MINVALUE 1   NO MAXVALUE start with 1 ;
CREATE SEQUENCE



2、查看序列属性

skytf=> \d seq_test_1
          Sequence "skytf.seq_test_1"
    Column     |  Type   |        Value        
---------------+---------+---------------------
 sequence_name | name    | seq_test_1
 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 | f


3、查看序列的Next值

skytf=> select nextval('seq_test_1');
 nextval 
---------
       1
(1 row) 
skytf=> select nextval('seq_test_1');
 nextval 
---------
       2
(1 row)


4、查看序列最近使用的值或说是当前值是什么

skytf=> select currval('seq_test_1');
 currval 
---------
       2
(1 row) 
skytf=> select currval('seq_test_1');
 currval 
---------
       2
(1 row)


5、那么如何解决呢?重置下序列的值

方法一:

skytf=> select setval('seq_test_1',100);
 setval 
--------
    100
(1 row) 
skytf=> select currval('seq_test_1');
 currval 
---------
     100
(1 row)

skytf=> select nextval('seq_test_1');
 nextval 
---------
     101
(1 row)

说明:把序列修改为100


方法二:

skytf=> alter sequence seq_test_1 restart with 200;
ALTER SEQUENCE 
skytf=> select nextval('seq_test_1');
 nextval 
---------
     200
(1 row)

skytf=> select nextval('seq_test_1');
 nextval 
---------
     201
(1 row)

skytf=> \d seq_test_1
          Sequence "skytf.seq_test_1"
    Column     |  Type   |        Value        
---------------+---------+---------------------
 sequence_name | name    | seq_test_1
 last_value    | bigint  | 201
 start_value   | bigint  | 200
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 31
 is_cycled     | boolean | f
 is_called     | boolean | t


说明把序列的值修改为200(当前的序列值)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐