Mysql:如果没有更多的引用(在多个引用中),则自动删除该行

Mysql:如果没有更多的引用(在多个引用中),则自动删除该行,mysql,foreign-keys,Mysql,Foreign Keys,在我的数据库中,我有两个表:消息和更新。这两个表存储一些信息,如文本,可以有0、1或多个参数。为了保存这些参数,我还有两个表:Messages_params和Updates_params。这两个表具有相同的列: 身份证 ID\u消息/ID\u更新 钥匙 原始值(可以为空) ID\u直接\u引用(可以为空) 这些参数可以是:原始值(存储为varchars),在这种情况下,原始值等于实际值,ID_direct_reference为null,或者是我称之为“direct reference”的ID

在我的数据库中,我有两个表:消息和更新。这两个表存储一些信息,如文本,可以有0、1或多个参数。为了保存这些参数,我还有两个表:Messages_params和Updates_params。这两个表具有相同的列:

  • 身份证
  • ID\u消息/ID\u更新
  • 钥匙
  • 原始值(可以为空)
  • ID\u直接\u引用(可以为空)
这些参数可以是:原始值(存储为varchars),在这种情况下,原始值等于实际值,ID_direct_reference为null,或者是我称之为“direct reference”的ID。这些直接引用只是包含PHP类名的表,可以有自己的参数

因此,我有另外两个表保存这些直接引用及其参数:直接引用(ID,class_name)和直接引用参数(ID,ID_direct_reference,key,value)

基本上,我做这个系统是为了让我的应用程序更新和消息具有动态参数。例如,假设用户A喜欢用户B的照片。为用户B创建一个更新,该更新需要说“{pseudo of user A}喜欢您的照片”。更新会立即创建,但仅当用户B在客户端应用程序上并轮询新更新时,才会传递到客户端应用程序。如果用户B在更新创建一小时后返回应用程序,并且如果用户A同时更改了其伪用户,则用户B将收到旧用户A伪用户的更新。因此,基本上,我希望在交付时计算一些更新参数(而不是在创建时)

当更新(或消息)被传递时,我的服务器会检查其参数中的直接引用;它调用直接引用的特定方法
classname
(通过PHP反射),并将直接引用参数发送到此方法,以便类知道返回什么

现在我的问题来了:我希望这些直接引用在mysql中被外键自动删除时被删除。但是,由于这些直接引用在理论上可以由多个表中的几行(messages params和updates params以及可能需要它们的任何东西params)持有,我怎么能对mysql说“如果没有行,在没有表中,自动删除直接引用行(以及相关的DR params)包含它的ID”


谢谢你读了这个复杂的问题。

你真的不能。外键就是不起作用。可以在下游级联删除,但不能在上游级联删除

相反,您应该考虑在“子”表上使用触发器,以便在删除这些表中的记录时,您可以触发代码来检查并查看父级与其他子级之间的其他关系,然后在必要时将其删除

CREATE TRIGGER cleanup_message AFTER DELETE on myTable
FOR EACH ROW
  BEGIN
  DELETE FROM messages
     WHERE message.id = old.id
     and messages.id not in (select ID from sometothertable)
     and messages.id not in (select ID from yetanothertable)
END

谢谢你的回答,我没有想到mysql触发器。我发现的唯一问题是,这个解决方案可能无法在性能方面进行优化(mysql需要对我的所有表进行重新oop以检查是否有其他引用)。我刚刚发现mysql触发器不能与外键级联删除一起工作……我发现mysql触发器不能级联,这与PostgreSQL不同。如果我删除一个成员,他们的消息将被外键级联自动删除,但触发器不会运行。。。