10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

评论

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

全面掌握 Consul:服务注册发现、健康检查、跨数据中心一网打尽

左诗右码

为什么有些企业不用腾讯会议,会单独采购私有化部署的会议系统?

BeeWorks

即时通讯 IM 私有化部署

在 Amazon Bedrock 中结合 RAG 与 MCP 高效缓解提示词膨胀问题

亚马逊云科技 (Amazon Web Services)

4 款最适合打造灵活工单系统的开源零代码/低代码平台

NocoBase

低代码 零代码 工单 工单管理 开源‘

黑龙江等保测评实施流程四阶段

等保测评

Apache IoTDB PMC 主席黄向东:积跬步,至千里,IoTDB 的 2023-2025

Apache IoTDB

系统性能提升70%,华润万家核心数据库升级

老纪的技术唠嗑局

数据库设计 性能调优 oceanbase

如何5分钟内,发布一篇提示词分享的公众号文章

龙正哲

YashanDB容灾备份策略,保障企业关键数据安全无忧

数据库砖家

付费功能免费用!!!Yops 运维面板 v0.9 正式发布

Yops-运维易

Linux 程序员 服务器 Linux 运维 #docker

“医” 起穿越三国,开启《脑洞三国》新体验

博文视点Broadview

基于YOLOv8的无人机航拍树木目标检测系统|精准识别【含完整训练源码+部署教程】

申公豹

人工智能

从百万到十万:低代码在企业应用系统开发中的成本优化路径

JeeLowCode低代码平台

低代码 低代码, 低代码引擎 低代码工具 低代码技术

CST基础教程:如何在3D 中添加多针脚集总元件

思茂信息

cst操作 CST软件 CST Studio Suite

选择局域网视频软件,让你的开会数据仅在企业内网流转!

BeeWorks

即时通讯 IM 私有化部署

微软紧急发布IE浏览器带外安全更新修复关键漏洞

qife122

安全更新 带外发布

如何选择适合的LED广告屏?

Dylan

广告 LED LED display LED显示屏 LED屏幕

工业数据管理的八大痛点,为何总是治标不治本?一次架构重构告诉你答案

TDengine

tdengine 工业数据 idmp

基于 EventBridge 构筑 AI 领域高效数据集成方案

阿里巴巴云原生

阿里云 云原生 EventBridge

详细教程:DNS服务器未响应是怎么回事,有哪些解决方法?

国科云

隐私作为差异化优势:苹果的零知识实现与匿名中继技术

qife122

隐私保护 Oauth

从技术协同到生态共建:BOE(京东方)“双京赋能计划”三周年树立行业创新合作新标杆

科技热闻

大数据-74 Kafka 核心机制揭秘:副本同步、控制器选举与可靠性保障

武子康

Java 大数据 kafka 分布式 消息队列

别让代码毁了低空经济!80% 风险藏在第三方组件里,SCA是唯一 “透视镜”

安势信息

SCA 开源组件 低空经济 无人机安全 许可证合规

PAC2025:鲲鹏平台“挑大梁”,国产算力点燃青春力量

科技热闻

非凸底仓增强算法上线中山证券,智启普惠投资新时代

非凸科技

WebGL开发框架概述

北京木奇移动技术有限公司

软件外包公司 数字孪生开发 webgl开发

黑龙江等保测评方法详解

等保测评

IBM 研究报告:体育粉丝对AI助力的动态数字内容的需求增长

财见

长电科技发布2025年中报:面向未来持续加大先进封装投入力度,二季度及上半年营收同创历史新高

财见

8 月中 汇报下近半个月都在做些什么

万少

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