如何处理循环外键插入?

Mar*_*rco 4 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
Run Code Online (Sandbox Code Playgroud)

如果我创建了一个发布行,则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的外键,我不知道数据库中是否存在这种道德规范?

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

谢谢

Ja͢*_*͢ck 5

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

  1. main_release_id完全放弃了这个领域

  2. release_mainrelease表中添加一个字段; 它将是NULL(不是主要的)或1(主要的).

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

更新

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

(release_group_id [FK], release_id [FK], is_main)
Run Code Online (Sandbox Code Playgroud)

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

老答案

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

  1. 插入release_groupmain_release_id存在null; 获取最后插入的ID.

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

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

  4. 提交交易

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


Hes*_*ess 5

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

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