gpt4 book ai didi

MySQL:奇怪的外键约束

转载 作者:行者123 更新时间:2023-11-30 00:41:39 25 4
gpt4 key购买 nike

我有以下两个表:

tree_instance:
- tree_id INT
- country_id INT
- time_segment date

node_instance:
- country_id INT
- time_segment date
- CONSTRAINT `node_instance_ibfk_1` FOREIGN KEY (`time_segment`) REFERENCES `tree_instance` (`time_segment`) ON DELETE NO ACTION ON UPDATE NO ACTION

一些事实:

  • 某些节点存在于特定国家/地区(节点独立于国家/地区存在)
  • 对于每个国家/地区,可能有一些树来构造其某些节点(在同一国家/地区内)
  • 节点没有tree_id列,因为它们可以包含在0..n棵树中(还有另一个带有tree_id列的m:n表)
  • 节点可以在同一国家的不同树之间共享,但不能在不同国家之间共享
<小时/>

当我添加新结构时,首先我添加新的tree_instance,例如

tree_id: 2
country_id: 1
time_segment: 2014-01-01

然后我插入节点。对于country_id=2 也是如此。

当我想移除其中一个国家的树木时,就会出现问题。首先,我尝试删除country_id=1 的所有node_instances。成功。然后我尝试删除 tree_instance WHERE Country_id = 1 并收到以下错误:

Cannot delete or update a parent row: a foreign key constraint fails (`db_name`.`node_instance`, CONSTRAINT `node_instance_ibfk_1` FOREIGN KEY (`time_segment`) REFERENCES `tree_instance` (`time_segment`) ON DELETE NO ACTION ON UPDATE NO ACTION)

这是因为有来自country_id=2的node_instances指向我想要删除的time_segment(约束)。但我无法理解的是,仍然有一个带有 time_segment 的 tree_instance (country_id=1,我没有删除)可以容纳约束。为什么 MySQL 会抛出约束冲突?

最佳答案

如果我正确理解了这个问题,这就是您想要做的

  1. time_segment 列的 node_instance(子表)中有一个外键,引用 tree_instance.time_segment
  2. 您从 node_instance(子表)中删除 country_id = 1 的记录。本次操作成功
  3. 现在,您尝试从 tree_instance 中删除记录,但出现错误。

这种情况正在发生,因为外键仍然存在并且处于事件状态。它不能让您删除父记录,因为子表中可能有记录仍然引用父表中的记录。要删除父表中的记录,需要禁用约束。

编辑:我编辑以引用正确的外键列。即使外键位于 time_segment 列上,您也可以删除子表中的记录,但无法删除父表中的记录,因为子表中的外键正在引用父表的 time_segment 列。父表不允许删除,因为子表中可能有一些记录引用了父表中的time_segment

关于MySQL:奇怪的外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21727648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com