写点什么

PostgreSQL 中如何启用 / 禁用及验证外键约束

  • 2021-01-09
  • 本文字数:1106 字

    阅读完需:约 4 分钟

PostgreSQL 中如何启用/禁用及验证外键约束

1 问题提出


近期在做多个数据源 DB 的数据向一个目标 DB 做数据迁移的过程中,遇到有外键约束的表,由于表之间数据的依赖关系和数据的导入顺序导致数据加载失败,因此记录了一下关于这类问题的解决思路。

testa 中 t1 表结构及数据如下:



testb 中 t2 表结构及数据如下:



当恢复数据时,由于数据导入顺序问题,可能会出现违反约束的报错。


比如,首先恢复的 t2 表中数据,此时会有如下的报错:



2 分析问题


这里数据本身并没有问题,只是当时恢复表数据时候首先恢复了 t2 表导致了违反外键约束的报错,此时我们可以首先禁用 t2 表上的外键约束并在加载对其进行验证。



这里 all 会禁用表上的所有外键,同时也禁用负责验证约束的内部触发器,这里使用 all 也存在一些限制,就是你必须是超级用户才能执行此操作,如果是普通用户执行将失败。如果你想要使用普通用户去禁用某一特定用户的用户触发器。



此时,我们再对表 t2 进行数据插入可以成功:



此时,我们首先插入一条违反外键约束的数据,然后将约束条件启用:



此时成功启用约束条件,但是没有报错不符合外键约束!那我再向 t2 插入一次数据,验证约束是否真的生效。



由此可以验证,验证约束的内部触发器已经启用,对于后续新插入或者更新的数据会进行检查。那么对于之前的行,为什么没有进行检查呢?



通过查看系统表 pg_constraint,我们可以看到约束记录的状态为已验证。


3 解决问题


那么我们应该如何处理数据恢复中的外键约束问题并且使新数据和老数据都进行有效性验证呢?


方法 1:删除外键


  • 删除表中的所有外键

  • 加载数据

  • 重新创建外键,但使其无效,以避免增大 cost,现在数据会被验证

  • 当系统功能负载较小时,验证约束



这样的方式,创建无效外键对后续新插入和更新的数据有约束作用,在外键检查时对之前存在的数据可以进行检查,从而保证所有的数据符合外键约束。


方法 2:修改系统表状态


通过上面的测试我们可以知道,在对约束禁用期间,约束记录的状态为已验证,此时我们可以直接更新系统表 pg_constraint。




在这种情况下,这个约束将被完全验证,因为他在系统表中记录为无效。


方法 3:约束延迟生效



这样做的缺点是它仅在一个事务中生效。因此,必须在事务中保证各表之间数据的约束。


4 小结


迁移数据时,如果涉及外键约束的多个表的导入(尤其来自多个数据源,原始数据不一定满足约束关系),灵活启用/禁用及验证外键约束,可使迁移后合并的数据切实满足外键约束,保证 DB 中的关系完整性。



头图:Unsplash

作者:彭占元

原文:https://mp.weixin.qq.com/s/Lom04TPWlSse-hEqRuSV_Q

原文:PostgreSQL 中如何启用/禁用及验证外键约束

来源:Qunar 技术沙龙 - 微信公众号 [ID:QunarTL]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021-01-09 23:195096

评论

发布
暂无评论
发现更多内容

数字人民币究竟是什么

CECBC

数字货币

架构师训练营 W05 作业

Geek_f06ede

区块链+供应链,双链融合开启新时代

CECBC

区块链 供应链物流

实现2nm工艺突破,台积电为何能给“摩尔定律”续命?

脑极体

Maven-技术专题-Setting文件结构解析

码界西柚

阿里P8架构师吐血整理的《SpringBoot+Vue全栈开发实战》文档资料

Java架构之路

Java 程序员 架构 面试 编程语言

3年Java开发经验从阿里、美团、滴滴面试回来,想和Java程序员谈一谈感悟及面经

Java架构之路

Java 程序员 架构 面试 编程语言

入坑 docsify,一款神奇的文档生成利器!

沉默王二

docsify

JVM运行时数据区,你真得好好学一学

Simon郎

JVM Java 分布式

结合实战和源码来聊聊Java中的SPI机制?

冰河

Java spi 服务发现

阿里大牛八年打造,编程宝典,从初学到编程进阶—深入学习—实战

Java~~~

Java 阿里巴巴 程序员 架构 编程语言

输入法B端市场转化:百度推动产业智能化的新路径

脑极体

石、火、水:从OriginOS透视移动系统进化论

脑极体

一周信创舆情观察(11.9~11.15)

统小信uos

第九周学习性能优化 3 总结

三板斧

极客大学架构师训练营

32核打赢AMD64核 英特尔Ice Lake为HPC提供强劲性能

E科讯

微服务手册:高速查询?除了Redis我们还有另外的选择

互联网应用架构

redis 微服务 springboot Caffeine 高速缓存

释放数字化活力 高质量建设数字中国

CECBC

数字经济

架构师训练营 1 期 -- 第九周作业

曾彪彪

极客大学架构师训练营

DataOps系列丨数据的「资产负债表」与「现状」

DataPipeline数见科技

大数据

Appium常用操作之「Toast提示信息获取」

清菡软件测试

消灭微服务的坏味道 之 循环依赖

码猿外

微服务 循环依赖 坏味道

五、一致性哈希算法

Geek_28b526

【得物技术】浅谈分布式事务中间件Seata

得物技术

开源 分布式事务 中间件 解决方案 seata

DataOps系列丨DataOps的组织架构与挑战

DataPipeline数见科技

大数据

《迅雷链精品课》第六课:主流区块链数据存储分析(一)

迅雷链

区块链

DataOps系列丨DataOps理念与设计原则

DataPipeline数见科技

大数据

git使用与原理剖析及其私服搭建

Fox爱分享

git

MySQL 连接为什么挂死了?

华为云开发者联盟

微服务 数据 存储

互联网券商系统搭建建议书

软件开发大鱼V15988750073

国际配售 港股交易系统开发 证券交易系统 IPO系统开发 金融平台搭建

大专学历Java开发7年,从年初被裁到四面美团点评成功上岸,闭关七个月,入职那一天我哭了!

Java架构追梦

Java 阿里巴巴 面试 美团 java架构

PostgreSQL 中如何启用/禁用及验证外键约束_语言 & 开发_Qunar技术沙龙_InfoQ精选文章