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

 

对于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', (select xxx_id from xxx order by xxx_id desc limit 1), false); 
否则恢复的时候,数据是不完整的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trainee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值