一对多的逆转关系?

时间:2015-10-16 08:31:13

标签: mysql sql

我的数据库有一个特殊的设置。 (见附件截图)

  

所以我有实现和项目,他们可以附加一个画廊,画廊包含图片。

现在我似乎无法建立这样的关系:如果我删除了一个实现或项目,那么附加的图库也会被删除。

我在画廊表和realizations / projects表上尝试了两种外键组合。

知道我可能会监督什么吗?谢谢!

enter image description here

这是我试过的SQL

ALTER TABLE `galleries`
ADD CONSTRAINT `FK_galleries_realisations` FOREIGN KEY (`id`) REFERENCES `realisations` (`gallery_id`) ON UPDATE CASCADE ON DELETE CASCADE;

这是我在尝试创建新实现时遇到的错误

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`elbeko`.`galleries`, CONSTRAINT `FK_galleries_realisations` FOREIGN KEY (`id`) REFERENCES `realisations` (`gallery_id`) ON DELETE CASCADE ON UPDATE CASCADE) (SQL: insert into `galleries` (`name`, `updated_at`, `created_at`) values (Tester, 2015-10-16 08:53:28, 2015-10-16 08:53:28))

1 个答案:

答案 0 :(得分:1)

它不是一个特殊的,而是“潜在的”危险建筑。 根据您的图表,许多项目可以指向单个图库,如果删除了一个项目,则不希望删除图库。因为其他项目“可以”仍然使用该特定的画廊。

您可以修改图库表,以便每个图库记录都指向项目/实现ID / UUID,以便您可以利用级联。

如果您确实要删除图库记录,请使用“删除后”触发器 并执行。

  1. 在所有其他记录inc上设置gallery_id = null。其他表
  2. 从图库表中删除
  3. 其中gallery_id = old.gallery_id
  4. 再次......非常危险的imho。

    如果你想规范你的表格,你可以简单地为每个项目创建两个图库表格,并且实现 OR 你可以利用G / UUID并拥有一个图库表。

    GUID被称为全球唯一标识符。 MSSQL将其称为GUID,MySQL将其称为UUID(通用唯一标识符)

    GUID用于在整个应用程序中使用唯一ID。在您的情况下,由于project_id和realisation_id可以具有相同的值,因此您不能将此字段用作库表中的常用外键。

    拥有单个图库表并使用GUID

    1. 添加一个名为project_uuid的新字段varchar(36)not null default“0”
    2. 在tbl_project表上添加/修改“插入前”触发器
    3. if(length(coalesce(new.project_uuid,'')) <> 36) then
        set new.project_uuid = (select UUID());
      end if
      
           

      每次插入项目记录时,都会生成新的GUID。

      1. 通过
      2. 为现有项目记录分配新的GUID
         Update tbl_project
        set project_uuid = (Select uuid())
        Where tbl_project.project_id >= 1;
        
             

        现在,所有现有项目记录都分配了唯一的GUID

        1. 为实现表做同样的事情
        2. 现在在您的图库表中添加一个新字段owner_uuid varchar(36)
        3. 理想情况下,您的图库表结构将如下所示
        4. Gallery_id int, not null, primary, auto increase
          owner_uuid varchar(36) ' usually second primary but for the migration it can be null
          gallery_name ....
          ...
          
          1. 现在您需要使用唯一GUID

            替换旧ID
            Update tbl_gallery inner join tbl_project on tbl_project.gallery_id = tbl_gallery.id
            SET owner_uuid = tbl_project.project_uuid 
            Where tbl_gallery.owner_uuid is null;
            
          2. 为实现表做同样的事情

          3. 现在,您可以在项目&lt;&gt;之间建立简单的1:N级联关系画廊和实现&lt;&gt;画廊表。

            现在,当您创建图库记录时,您将使用

            Insert into tbl_gallery(id, owner_uuid, name)
            VAlues(
            null, 
            either project_uuid or realisation_uuid
            name );