PostgreSQL: 資料遷移之序列問題(也可以使用在所有使用序列資料庫上,比如Oracle)
阿新 • • 發佈:2019-02-08
一、問題背景:
今天在做一個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(當前的序列值)