Mysql 一对多反向关系?

Mysql 一对多反向关系?,mysql,sql,Mysql,Sql,我的数据库有一个特殊的设置。(见所附屏幕截图) 所以我有一些实现和项目,他们可以在上面附加一个图库,图库包含图片 现在我似乎无法建立这样的关系:如果我删除了一个实现或一个项目,附加的图库也会被删除 我在galleries表和Realizations/projects表中尝试了两种外键组合 知道我在监督什么吗?谢谢大家! 这就是我尝试的SQL ALTER TABLE `galleries` ADD CONSTRAINT `FK_galleries_realisations` FOREIGN KE

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

所以我有一些实现和项目,他们可以在上面附加一个图库,图库包含图片

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

我在galleries表和Realizations/projects表中尝试了两种外键组合

知道我在监督什么吗?谢谢大家!

这就是我尝试的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))
这不是一个特殊的但“潜在”危险的架构。 根据您的图表,许多项目可能指向单个库,如果删除了一个项目,您不希望删除库。因为其他项目“可以”使用特定的库

您可以修改gallery表,使每个gallery记录指向一个项目/实现ID/UUID,以便利用级联

如果确实要删除库记录,请使用“删除后”触发器 表演

  • 在所有其他记录(包括其他表)上设置gallery_id=null
  • 从库表中删除
  • 其中gallery\u id=old.gallery\u id
  • 再次。。。非常危险

    如果您想规范化表格,只需为每个项目创建两个图库表格,即可实现您可以利用G/UUID并拥有一个图库表格

    guid被称为全局唯一标识符。MSSQL调用它的GUID,MySQL调用它的UUID(通用唯一标识符)

    GUID用于在整个应用程序中具有唯一ID。在您的情况下,由于project_id和realization_id可能具有相同的值,所以不能将this字段用作gallery表中的公共外键

    要拥有单个库表并使用guid

  • 添加一个名为project_uuid varchar(36)的新字段非空默认值“0”
  • 在tbl_项目表上添加/修改“插入前”触发器
  • 现在,所有现有项目记录都分配了唯一的GUID

  • 对实现表执行相同的操作
  • 现在在gallery表中添加一个新的字段所有者\u uuid varchar(36)
  • 理想情况下,您的多媒体资料表结构如下所示
  • 现在需要用唯一的GUID替换旧ID

  • 对实现表执行相同的操作

  • 现在,您可以在project gallery和Realization gallery表之间建立简单的1:N级联关系

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

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

    代码在laravel(迁移)中,但更多的是关于逻辑的问题。关系应该位于哪个表上,这更是我的问题。谢谢。我试过了,但出现了一个错误,我将在问题中添加我的代码,1分钟!我补充了更多的解释。谢谢你!我知道数据库结构很奇怪。但我在想,若我想添加一个实现或项目的ID,那个么会有重复的ID,对吗?谢谢你的回答。你可以修改你的表格吗@当然不可以我很乐意。。但我真的不知道如何实现你的想法。因此,我确实可以使用级联。因为项目id可以与实现id相同。没有项目,Gallery记录不可能存在,因此Gallery表应该有Gallery\u id、owner\u id(项目\u id/实现\u id)。最简单的方法是为每个表设置两个图库表。如果你只想拥有一张多媒体资料表,你需要使用G/UUID而不是ID。谢谢你的回答,我的每张表有两张多媒体资料表是什么意思?像实现画廊,项目画廊。。我认为更好的选择是使用所有者id?谢谢
     Update tbl_project
    set project_uuid = (Select uuid())
    Where tbl_project.project_id >= 1;
    
    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 ....
    ...
    
    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;
    
    Insert into tbl_gallery(id, owner_uuid, name)
    VAlues(
    null, 
    either project_uuid or realisation_uuid
    name );