Mysql:如果没有更多的引用(在多个引用中),则自动删除该行
在我的数据库中,我有两个表:消息和更新。这两个表存储一些信息,如文本,可以有0、1或多个参数。为了保存这些参数,我还有两个表:Messages_params和Updates_params。这两个表具有相同的列: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
- 身份证
- ID\u消息/ID\u更新
- 钥匙
- 原始值(可以为空)
- ID\u直接\u引用(可以为空)
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不同。如果我删除一个成员,他们的消息将被外键级联自动删除,但触发器不会运行。。。