我需要创建一个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';
当然,如果没有记录,程序应该退出。
所以,我试图将这一切都整合到一个存储过程中。此存储过程将与电子邮件程序一起使用,该程序将根据请求从各种列表中删除电子邮件。现在,我正在手工做,而且它变得乏味。
我很感激任何指针或想法。提前谢谢。
答案 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标识符的问题,你的其余程序似乎非常简单。