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

第三方工具导入导出PG可能出现的问题

发布时间:2020-12-13 17:59:12 所属栏目:百科 来源:网络整理
导读:对于PostgreSQL,导出、导入一般用自带的pg_dump和pg_restore或psql. 若要第三方非特制的工具导出,再导入,或者手工写SQL,除了注意触发器和约束等其他数据库必须注意的通常问题外,还要考虑pg中serial问题: 在pg中,插入一个带有serial字段的表,若不指明s
对于PostgreSQL,导出、导入一般用自带的pg_dump和pg_restore或psql. 若要第三方非特制的工具导出,再导入,或者手工写SQL,除了注意触发器和约束等其他数据库必须注意的通常问题外,还要考虑pg中serial问题:
在pg中,插入一个带有serial字段的表,若不指明serial字段值,serial会自动增加一个值,这和其他数据库是一样的。
比如一张表,
create table test (
t_int serial primary key,
t_c char(2));
假设serial当前值为2,
当插入一个不指明serial的语句 insert into test (t_c) values ('aaa');
t_int自动增加为3。
然而当你插入一个带有serial字段值的SQL语句的时候,serial值不会自动改变。(其他数据库如mysql,会自动变为max(当前serial值,插入的serial值)。
比如:insert into test (t_int,t_c) values (4,'aaaa'); serial当前值并不会这条语句的插入而改变,还停留在上个当前值3。
当你插入下一条语句insert into test (t_c) values ('bbb');出现duplicate key错误,因为此时serial有3增加为4,与上一条语句出现主键约束冲突。
所以用第三方非特定工具备份带有serial字段的表,必须将serial的当前值备份出来,即加上一条语句:
SELECT pg_catalog.setval('xxxx_seq',xxxx,false);
或者
select pg_catalog.setval('xxxx_seq',(selectxxx_id from xxx order by xxx_id desc limit 1),false);
否则恢复的时候,数据是不完整的。

(编辑:李大同)

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

    推荐文章
      热点阅读