如何处理循环外键插入?

时间:2013-08-28 02:09:11

标签: php mysql

我有一个表'release_group'和另一个表'release',如下所示:

release_group 
------------------------
release_group_id (PRIMARY KEY)
name
main_release_id (FOREIGN KEY)

release
------------------------
release_id (PRIMARY KEY)
release_group_id (FOREIGN KEY)
name

如果我创建了一个发布行,那么 release_group_id 就不可用,因为它尚未创建。但是如果没有 main_release_id ,我无法创建release_group行。所以这是一种不可能的情况。

编辑: release_group中的main_release_id是说发布是组中的主要内容,我将使用引用。

处理此案件的专业方法是什么?

1。 删除表 release_group 中的外键索引 main_release_id ,并将属性设置为ALLOW NULL。创建release_group行,以便我可以在发布行中应用它的id。

2。 将'main_release_id'外键索引保留在表'release_group'中,并为其分配一个临时整数值0.创建发布行并相应更新release_group中的外键?请记住,如果这是要走的路,我可能最终无意中拥有值为0的外键,我不知道数据库中是否存在这种道德?

处理此案件的专业方法是什么?

由于

3 个答案:

答案 0 :(得分:5)

查看发布不能属于多个组,您可以通过以下方式删除并发症:

  1. 完全删除main_release_id字段

  2. release_main表格中添加release字段;它将是NULL(不是主要)或1(主要)。

  3. UNIQUE上添加(release_group_id, release_main)约束,以确保只能有一个主要版本。

  4. <强>更新

    如果某个版本可以属于多个组,则需要创建一个多对多表并将两个表中的外键移入其中:

    (release_group_id [FK], release_id [FK], is_main)
    

    主键将跨越前两个字段。确保只有一个主要版本需要在第一个和最后一个字段上使用跨越唯一键。

    旧答案

    假设main_release_id是可以为空的字段,我建议如下:

    1. 插入release_groupmain_release_idnull;获取最后插入的ID。

    2. 插入release条目,传递上一步的id;获取最后插入的ID。

    3. 更新release_group表条目,将main_release_id的值设置为您从上一步获得的值。

    4. 提交交易

    5. 或者,您可以使用序列,以便在插入条目之前知道id。请参阅LAST_INSERT_ID()下的手册中的示例。

答案 1 :(得分:5)

看起来你正试图建立多对多的关系。要正确执行此操作,请从release_group和release表中删除外键。添加一个包含release_id外键和释放外键的新表(release_to_release_group)。

编辑:这里不需要循环外键。从release_group中删除main_release_id foreign_key并在发布表中添加is_main_release标志。

答案 2 :(得分:2)

通常的做法是让表格相互引用。通常,您将父表(release_group)作为子表(发行版)中的外键引用,但不能将release_id作为release_group表中的外键。

也许在发布表中添加一个布尔标志,表明它是Main版本,并取消release_group中的main_release_id。