数据迁移之序列问题
上一篇 /
下一篇 2013-10-31 13:38:01
/ 个人分类:Database
一、问题背景:
今天在做一个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
收藏
举报
TAG: