写点什么

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

评论

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

告别人工误差与效率瓶颈:智能仓储助力烟草企业实现精益化管理

中烟创新

号码生成系统的创新实践:游戏周周乐幸运码设计

vivo互联网技术

redis 架构 后端 高并发 库存

全面加速!华能能源交通公司携手用友,开启现代供应链数智化新征程

用友BIP

AI英语听力APP的核心功能

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

软件外包公司 AI听力学习 AI英语学习

Spring Boot 插件化开发模式,忒香了!

Geek_e3e86e

Java 编程

CAD一键锁定坐标,图块批量插入快人N步!

在路上

cad 浩辰CAD CAD看图王

CANN开放端侧NPU自定义算子编程,助力QQ音乐首创移动端实时声伴分离

HarmonyOS SDK

harmoyos

搜索数据建设系列之数据架构重构

百度Geek说

spark 计算引擎 数仓模型设计 图灵

森马服饰从 Elasticsearch 到阿里云 SelectDB 的架构演进之路

SelectDB

大数据 BI ES Doris 实时数仓架构

去中心化 AI 生态基于DePIN起飞

PowerVerse

AI DePIN

时序数据库 TDengine × Node-RED:打造开箱即用的工业数据自动化流程

TDengine

tdengine 时序数据库 国产时序数据库 时序数据库tdengine

在AI时代,挖掘新需求比实现功能更具挑战性

qife122

开发者工具 需求分析

三角偶极子天线(下)---MIMO系统, 包络相关系数ECC和分集增益DG

思茂信息

cst仿真软件 CST软件 CST Studio Suite

AI 背单词 App 的技术架构

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

软件外包公司 AI英语学习 AI背单词

正品库拍照PWA应用的实现与性能优化|得物技术

得物技术

PWA

ASP.NET Core 防伪令牌系统

qife122

ASP.NET Core 防伪令牌

Alpha系统联结大数据、GPT两大功能,助力律所管理降本增效

科技汇

MyEMS能源管理系统后台配置-计量表管理

开源能源管理系统

开源 能源管理

智慧灌区系统(源码+文档+讲解+演示)

深圳亥时科技

假如你从7月开始准备Java面试,如何秋招拿下offer?

程序员高级码农

java 程序员‘

怎么修改网站域名的DNS服务器?

防火墙后吃泡面

HDFS迁移:企业数据迁移的高效之旅与优化攻略

袋鼠云数栈

数据库 数据治理 数据迁移 数据管理 数栈

软件测试丨Playwright测试工程师必备技能总结

测试人

软件测试

Taobao Agent Russia丨俄罗斯淘宝代购集运系统搭建指南

tbapi

淘宝代购系统 俄罗斯淘宝代购系统

百度商业发布全球首个中文音视频一体化生成模型MuseSteamer

极客天地

全球LED大屏广告市场解析

Dylan

广告 LED显示屏 全彩LED显示屏 led显示屏厂家 户内led显示屏

AI英语听力APP开发

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

软件外包公司 AI英语学习 AI听力APP

Mike Cohn 解析:产品待办列表梳理

ShineScrum

PO 迭代 计划会议

MyEMS能源管理系统后台配置-数据源管理

开源能源管理系统

开源 能源管理

VKProxy新增CORS设置和http响应缓存

八苦-瞿昙

Proxy csharp

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