在Multi Table Delete上使用动态数据库名称的过程

时间:2013-04-01 19:09:27

标签: mysql stored-procedures sql-delete mysql-5.1

我正在尝试为MySQL 5.1创建一个过程,它将数据库名称作为参数,并在该数据库中发出MULTI DELETE。我遇到了两个我不确定如何解决的问题:

  • USE不能用于准备好的声明中。当我尝试时,我得到“准备好的语句协议中不支持此命令”。
  • MULTI DELETE无法删除其他数据库中的表。当我尝试时,我在MULTI DELETE中得到“Unknown table'x'。”

代码示例如下:

DELIMITER $$
CREATE PROCEDURE multi_test (
    IN dbname VARCHAR(20)
)
BEGIN
    SET @us = CONCAT('USE ', dbname, ';');
    PREPARE ustmt FROM @us;
    EXECUTE ustmt;
    DEALLOCATE PREPARE ustmt;
    SET @s = CONCAT('DELETE t FROM ', dbname, '.t as t INNER JOIN ', dbname, '.t2 as t2 IN t.f_id = t2.id');
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;

同样,这会导致“准备好的语句协议中不支持此命令”。

另一个目标是将其保留在MySQL中 - 我宁愿不使用连接到MySQL的脚本语言,而只是使用一些我可以从客户端CLI调用的MySQL过程。但是,我不反对在其他语言中使用过程(就像你在PostgreSQL中可以做的那样),如果在MySQL中有可能的话。

1 个答案:

答案 0 :(得分:1)

在尝试使用MULTI DELETE时,我似乎需要使用dbname和表ALIAS。

DELETE dbname.talias FROM dbname.t as talias INNER JOIN dbname.t2 as t2 ON talias.f_id = t2.id

我相信我已经尝试过但它失败了,但它现在似乎正在起作用: - /