一、问题背景:
今天在做一个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(当前的序列值) (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|