一、问题背景:
今天在做一个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(当前的序列值)