我的数据库有一个特殊的设置。 (见附件截图)
所以我有实现和项目,他们可以附加一个画廊,画廊包含图片。
现在我似乎无法建立这样的关系:如果我删除了一个实现或项目,那么附加的图库也会被删除。
我在画廊表和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))
答案 0 :(得分:1)
它不是一个特殊的,而是“潜在的”危险建筑。 根据您的图表,许多项目可以指向单个图库,如果删除了一个项目,则不希望删除图库。因为其他项目“可以”仍然使用该特定的画廊。
您可以修改图库表,以便每个图库记录都指向项目/实现ID / UUID,以便您可以利用级联。
如果您确实要删除图库记录,请使用“删除后”触发器 并执行。
如果你想规范你的表格,你可以简单地为每个项目创建两个图库表格,并且实现 OR 你可以利用G / UUID并拥有一个图库表。
GUID被称为全球唯一标识符。 MSSQL将其称为GUID,MySQL将其称为UUID(通用唯一标识符)
GUID用于在整个应用程序中使用唯一ID。在您的情况下,由于project_id和realisation_id可以具有相同的值,因此您不能将此字段用作库表中的常用外键。
拥有单个图库表并使用GUID
if(length(coalesce(new.project_uuid,'')) <> 36) then set new.project_uuid = (select UUID()); end if
每次插入项目记录时,都会生成新的GUID。
Update tbl_project set project_uuid = (Select uuid()) Where tbl_project.project_id >= 1;
现在,所有现有项目记录都分配了唯一的GUID
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 .... ...
现在您需要使用唯一GUID
替换旧IDUpdate 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;
为实现表做同样的事情
现在,您可以在项目&lt;&gt;之间建立简单的1:N级联关系画廊和实现&lt;&gt;画廊表。
现在,当您创建图库记录时,您将使用
Insert into tbl_gallery(id, owner_uuid, name)
VAlues(
null,
either project_uuid or realisation_uuid
name );