PostgreSQL 10.1仅数据备份遇通知:自引用外键是否需删除约束?
不需要删除
friend_fk约束来消除这个通知! 别慌,这个通知只是PostgreSQL的预警提示,完全不需要删除约束——约束是保障数据完整性的核心,删了反而会带来后续的数据一致性问题。下面给你拆解原因和正确的处理方式:
为什么会收到这个通知?
当你对包含自引用外键(members表的friend_id引用本表主键)的表执行仅数据转储时,PostgreSQL会主动提示这个约束的存在。原因很简单:默认的数据转储顺序是按表数据的物理存储顺序导出,导入时如果某条记录的friend_id指向的记录还没被导入,就会触发外键约束错误。这个通知只是提前告诉你这个潜在风险,不是转储失败的错误。
正确的处理方式(不用删约束)
你有几个靠谱的选项来避免导入时的约束问题,同时完整保留约束的保护作用:
- 转储时按主键排序导出:使用
pg_dump的--order-by-primary参数,让数据按主键顺序导出。这样导入时,被引用的主键记录会先被导入,自引用的外键就不会触发错误。命令示例:pg_dump --data-only --order-by-primary -d tlesson > tlesson_data.sql - 导入时临时禁用约束:如果已经生成了没有排序的dump文件,可以在导入前临时禁用
members表的外键约束,导入完成后再恢复。操作步骤:- 登录PostgreSQL执行:
ALTER TABLE members DISABLE TRIGGER ALL; - 导入数据:
psql -d tlesson -f tlesson_data.sql - 导入完成后恢复约束:
ALTER TABLE members ENABLE TRIGGER ALL;
- 登录PostgreSQL执行:
- 转储时自动处理约束:使用
pg_dump的--disable-triggers参数,dump文件里会自动包含禁用和启用触发器(包括外键约束)的语句,导入时会自动完成约束的临时禁用与恢复。命令示例:pg_dump --data-only --disable-triggers -d tlesson > tlesson_data.sql
总结
删除friend_fk约束是完全没必要的操作,反而会破坏你的数据完整性。选择上面的任意一种方法,都能解决潜在的导入问题,同时保留约束对数据的保护作用。
内容的提问来源于stack exchange,提问作者Park JongBum
相关产品推荐
相关产品推荐

