加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL: 数据迁移之序列问题(也可以使用在所有使用序列数据

发布时间:2020-12-13 17:42:03 所属栏目:百科 来源:网络整理
导读:一、问题背景: 今天在做一个OA系统,原先的数据库是Oracle的,后来改到Postgresql数据库,一开始把数据库迁移到Postgresql上来,序列和建表都通过Oracle导出的sql语句来完成,没有考虑到序列在重新创建后,会重新重初始值开始计算,让我遇到了现在的问题,

一、问题背景:

今天在做一个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(当前的序列值)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读