MySql存储过程,根据现有的表引用逻辑或逻辑删除记录

时间:2010-10-04 11:09:12

标签: mysql sql stored-procedures

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

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

CREATE TABLE `tempids` (
    `id` INT(11) NULL DEFAULT NULL
)
COLLATE='latin1_swedish_ci'
ENGINE=MEMORY
ROW_FORMAT=DEFAULT

我可以这样做:

DELETE FROM addresses INNER JOIN tempids ON addresses.id = tempids.id;

但是如果我的模型中的其他已知表中没有引用,我想在物理上删除地址表中的记录;否则我想逻辑删除记录。我想一次性做到这一点,就是没有在我的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;

我如何做到这一点?

感谢。

1 个答案:

答案 0 :(得分:1)

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

http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_row-count

所以“没有删除记录”条件被替换为 ROW_COUNT()== 0