首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新表主键并将更改传播到其他表

更新表主键并将更改传播到其他表
EN

Stack Overflow用户
提问于 2020-03-13 00:59:57
回答 2查看 316关注 0票数 0

我有一个表A,主键是A1Id列,A1列和A2列。我有一个表B,它的外键是A1Id列、B1列和B2列。我有一个表C,它的外键是AI1d列、C1列和C2列。

如何使用一条命令更新所有列?如果我更新主键,如何将更改传播到所有外键?我是SQL新手,这是一项微不足道的任务吗?

由于外键约束,我目前在更新单个表时遇到了困难。

EN

回答 2

Stack Overflow用户

发布于 2020-03-13 01:06:57

如何使用一条命令更新所有列?

如果我更新主键,如何将更改传播到所有外键?

这是一项微不足道的任务吗?

您不能用一个命令就能做到这一点,这不是一项微不足道的任务,它通常需要一个sql命令脚本,每个表都会重复进行更改;通常涉及更新和新列,以将旧数据“迁移”到新格式。更改主键是非常罕见的,而且几乎总是被认为是一个重大的更改,即使这种更改的细节相当小。

我能想到的最接近的(物理)类比就是试着把某样东西拆开,把它所有的螺丝都换成螺栓。

编辑:如果您只是在讨论如何更改用作主键的值,而不是字段或值的数据类型,那么R VISHAL的答案是正确的。您需要删除所有当前的约束,并重新创建它们来级联更新。您还可以禁用外键检查,更改值,然后重新启用外键检查;但通常不建议这样做,因为重新启用外键检查不会重新检查它们,因此如果您的更新将数据置于不一致的状态,它将不会被更正,甚至不会被检测到;而且该设置是全局的,因此正在进行的任何其他活动也可以自由地忽略它们自己的fk约束。

..。但是您通常也不应该更改主键值。如果值发生变化,它可能不是外键的好候选者;如果它是一个合成值(如自动递增的id),那么您几乎不应该更改它(许多新用户在出现漏洞时都会尝试“压缩”它们,但这很少是一个好主意。)

票数 2
EN

Stack Overflow用户

发布于 2020-03-13 01:23:53

在您的例子中,如果表B(A1id)和表C(A1id)都引用了表A(A1id),那么为了将update或delete操作传播到表B、C的所有外键,它们应该具有级联约束。例如,在MySQL中,您可以这样做:

代码语言:javascript
运行
复制
ALTER TABLE B 
ADD CONSTRAINT FKA 
   FOREIGN KEY B(A1id) 
   REFERENCES A(A1id) 
   ON UPDATE CASCADE 
   ON DELETE CASCADE

注意单词cascade。这是你想要的,还是我错过了什么?:/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60658696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档