MySQL - 存储过程 - union选择然后更新并插入

时间:2011-06-24 04:26:39

标签: mysql stored-procedures insert resultset

我需要创建一个MYSQL存储过程,它将使用UNION查询在五个表中的一个表中查找电子邮件地址。找到电子邮件地址后,存储过程需要更新原始表中的字段,并将信息插入另一个表中。

这是我的工会:

SELECT email, 'table1' AS nameoftable, status FROM table1 
WHERE email = 'you@example.com'
UNION
SELECT email, 'table2' AS nameoftable, status FROM table2 
WHERE email =    'you@example.com'
UNION
SELECT email, 'table3' AS nameoftable, status FROM table3 
WHERE email = 'you@example.com'

这应该返回一条记录,这将为我提供我在接下来的步骤中需要的nameoftable变量,例如: you@example.com table1 A

首先插入: INSERT INTO黑名单(电子邮件,表名,已添加)SELECT电子邮件,'nameoftable',已添加FROM nameoftable WHERE email ='you@example.com';

然后更新: UPDATE nameoftable SET status ='D'WHERE email ='you@example.com';

当然,如果没有记录,程序应该退出。

所以,我试图将这一切都整合到一个存储过程中。此存储过程将与电子邮件程序一起使用,该程序将根据请求从各种列表中删除电子邮件。现在,我正在手工做,而且它变得乏味。

我很感激任何指针或想法。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的问题似乎是您在变量中有一个表名,但您需要将该变量的值转换为标识符,以便您可以使用它执行正常的SQL操作。你可以这样ugly like this

IF nameoftable = 'table1' THEN
    UPDATE table1 SET status = 'D' WHERE email = 'you@example.com';
ELSEIF nameoftable = 'table2' THEN
    UPDATE table2 SET status = 'D' WHERE email = 'you@example.com';
-- etc
END IF;

或者您可以使用a prepared statement(或多或少是eval的一种形式):

PREPARE stmt FROM CONCAT('UPDATE ', nameoftable, ' SET status = ? WHERE email = ?');
EXECUTE stmt USING 'D', 'you@example.com';

我很确定CONCAT将在该上下文中起作用,但如果没有,则可以将SQL构建为变量并PREPARE

SET @update = CONCAT('UPDATE ', nameoftable, ' SET status = ? WHERE email = ?');
PREPARE stmt FROM @update;
EXECUTE stmt USING 'D', 'you@example.com';

一旦你克服了将变量的值转换为SQL标识符的问题,你的其余程序似乎非常简单。

相关问题