如何删除存储外键的关联表t_arch_layer_tech中的数据?
解决关联表
t_arch_layer_tech无法自由删除行的问题 问题背景
我手头有三个数据库表:t_arch_layer(架构层级表)、t_tech(技术栈表),还有一个关联表t_arch_layer_tech——这个表的作用是存储层级和技术的合法组合,通过外键约束保证不能插入t_arch_layer或t_tech里不存在的关联数据。但现在遇到个头疼的问题:我没法自由删除t_arch_layer_tech里的行,可又得保留插入时的外键限制,而且绝对不能动t_arch_layer和t_tech这两个主表。
问题排查&解决方案
碰到这种删不了的情况,第一时间就得去查你的外键关系配置!我之前就踩过这个坑——当时是把arch_layer_id和tech_id这两个字段单独设置成了独立外键,而不是把它们做成一个复合外键关联到主表,结果就导致只能删特定的数据对,没法自由操作关联表的行。
要解决这个问题很简单:
- 先把原来那两个单独设置的外键约束删掉
- 重新创建一个包含
arch_layer_id和tech_id的复合外键,关联到t_arch_layer.id和t_tech.id上
这么改完之后,既能保住“不能插入无效关联数据”的约束,又能随便删t_arch_layer_tech里的任意行,完全不会碰t_arch_layer和t_tech这两个主表。
总结要点
如果你的关联表需要用多个字段(比如这里的arch_layer_id和tech_id)来关联多个主表,一定要创建复合外键,别给每个字段单独加外键。单独的外键会带来不必要的约束限制,把关联表的操作给绑死了。
内容的提问来源于stack exchange,提问作者cpinamtz
相关产品推荐
相关产品推荐

