《HarmonyOS:领航者说》技术公开课来啦,大咖分享、实战解码,不容错过 了解详情
写点什么

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:194875

评论

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

云创平台+播放器SDK,腾讯云音视频新工具助力视频生产、终端能力全面升级

科技热闻

Numpy 的研究仿制 1

祖维

c Numpy

2022年第一季度保险服务数字化跟踪分析

易观分析

保险 消费金融

wallys/ IPQ4018/IPQ4028/Access Point Wireless Module Dual band 11AC Wave2 Module

wallys-wifi6

wallys/ IPQ4019/IPQ4029 /Access Point Wireless Module Dual band 11AC Wave2 Module

wallys-wifi6

超级详细的 Maven 教程(基础+高级)

Ayue、

maven

3个最佳实践助力企业改善供应链安全

SEAL安全

安全 软件供应链 第三方风险

iMile 利用 Zadig 多云环境周部署千次,跨云跨地域持续交付全球业务

Zadig

DevOps 持续交付 跨境电商 自动化运维 Zadig

京东联盟API - 万能转链接口 - 京品库接口 - 接口定制

江苏京酷电子商务有限公司

京东 API JSON格式化 开放api

wallys/m.2/Adapter card(one pcie1x to 4 x Mini PCIE)

wallys-wifi6

智能指标驱动的管理和决策平台 Kyligence Zen 全新上线,限量内测中

Kyligence

手把手教你安装jdk8配置环境变量

不凡~

揭秘百度智能测试在测试自动执行领域实践

百度Geek说

测试

web前端培训 | 34 道 Vue 高频面试题

@零度

Vue 前端开发

图像边缘检测的新方向——量子算法

启科量子开发者官方号

tensorflow 边缘计算 图像处理 量子计算 量子算法

瓜分1000+万奖金池,昇腾AI创新大赛2022实力赋能开发者

极客天地

《网络是怎么样连接的》读书笔记 - WEB服务端请求和响应(五)

懒时小窝

网络

基于信通院 Serverless 工具链模型的实践:Serverless Devs

阿里巴巴云原生

阿里云 开源 云原生 Serverless Devs

攻防演练之战前扫雷:漏洞管理的5大措施

青藤云安全

主机安全 资产安全 漏洞防护 攻防演练

揭秘!付费会员制下的那些小心机!

CRMEB

使用 Gerrit + Zadig 实现主干开发主干发布(含字节跳动飞书实践)

Zadig

DevOps 分支管理 敏捷实践 研发协作 开发模式

微博评论高可用高性能计算架构

地下地上

架构实战营

纯CSS 波点背景 🏀

德育处主任

css3 前端 纯CSS css特效 6月月更

从第三次技术革命看企业应用三大开发趋势

葡萄城技术团队

技术分享| 融合调度中的广播功能设计

anyRTC开发者

音视频 调度 实时消息 快对讲 广播

自主可控再下一城!首套国产ARTIQ架构量子计算测控系统发布

启科量子开发者官方号

算力 量子计算机 量子计算 离子阱 启科量子

火山引擎入选国内首个《边缘计算产业全景图》

火山引擎边缘云

云计算 云原生 边缘计算 火山引擎 火山引擎边缘计算

InfoQ百位优质创作者签约计划第三季,终于等到了!!!

InfoQ写作社区官方

热门活动 签约计划第三季

新朝旧将 vite和webpack煮酒论英雄

转转技术团队

vite webpack

等保测评结论为差,是不是表示等保工作白做了?

行云管家

等保 等保测评

防范企业数据泄露,就用网络安全产品堡垒机!

行云管家

数据库 网络安全 堡垒机 数据审计

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