MySql存储过程,根据现有表引用以逻辑或物理方式删除记录

MySql存储过程,根据现有表引用以逻辑或物理方式删除记录,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我必须编写一个存储过程来删除表中的记录 我有一个内存表“tableids”,其中存储了要从另一个表中删除的所有ID,比如“addresses” 我可以这样做: DELETE FROM addresses INNER JOIN tempids ON addresses.id = tempids.id; 但是,如果addresses表中的记录在我的模型中的其他已知表中没有引用,那么我希望从物理上删除这些记录;否则,我希望从逻辑上删除记录。我希望在一次快照中完成此操作,即不在SP中写入循环 在伪sq

我必须编写一个存储过程来删除表中的记录

我有一个内存表“tableids”,其中存储了要从另一个表中删除的所有ID,比如“addresses”

我可以这样做:

DELETE FROM addresses INNER JOIN tempids ON addresses.id = tempids.id;
但是,如果addresses表中的记录在我的模型中的其他已知表中没有引用,那么我希望从物理上删除这些记录;否则,我希望从逻辑上删除记录。我希望在一次快照中完成此操作,即不在SP中写入循环

在伪sql代码中:

DELETE 
    FROM addresses 
WHERE
    id NOT IN (SELECT address_id FROM othertable1 WHERE address_id=(SELECT id FROM tempids))
AND     id NOT IN (SELECT address_id FROM othertable2 WHERE address_id=(SELECT id FROM tempids))
...more possible references in other tables

IF "no records deleted"
    DELETE FROM addresses INNER JOIN tempids ON addresses.id = tempids.id;
ELSE
    UPDATE addresses SET deleted=TRUE INNER JOIN tempids ON addresses.id = tempids.id;
我如何做到这一点

谢谢。

您可以在删除后检查ROW_COUNT()函数值

因此,将“未删除记录”条件替换为行计数()==0

DELETE 
    FROM addresses 
WHERE
    id NOT IN (SELECT address_id FROM othertable1 WHERE address_id=(SELECT id FROM tempids))
AND     id NOT IN (SELECT address_id FROM othertable2 WHERE address_id=(SELECT id FROM tempids))
...more possible references in other tables

IF "no records deleted"
    DELETE FROM addresses INNER JOIN tempids ON addresses.id = tempids.id;
ELSE
    UPDATE addresses SET deleted=TRUE INNER JOIN tempids ON addresses.id = tempids.id;