MySQL foreach 循环
Posted
技术标签:
【中文标题】MySQL foreach 循环【英文标题】:MySQL foreach loop 【发布时间】:2018-08-20 17:57:01 【问题描述】:我必须在 mysql 中迭代我的表用户中的每一行。 我需要为 User 中的每次迭代创建一个新的行地址,其中一些条件如下所述。
我有 3 张桌子:
User: id, stuff, id_person, email
Person: id, stuff, id_address
Address: id, email
如果 User.id_person 不为 NULL 并且 person.id_address 为 NULL,我需要在 Address 中创建一个新行。 我必须使用与 User.email 相同的电子邮件创建行。 我必须对 User 中的每一行都这样做。
我尝试使用 MySQL 游标,但我不知道如何很好地使用它们。
我该怎么做?除了使用游标之外,还有其他方法吗?
提前致谢。
编辑:我刚刚意识到我还必须使用我刚刚创建的地址行的 id 更新 person.id_address。
【问题讨论】:
查找 INSERT ,,, FROM SELECT。如果您可以构造一个 SELECT 语句,该语句会导致插入地址所需的“行”,那么就可以完成这项工作,而无需求助于 foreach 循环。 你能贴出你试过的代码吗?这应该是一项相当容易的任务。如果我正确地分析了您的数据,我认为没有必要进行迭代,一个简单的INSERT INTO
带条件就足够了。
【参考方案1】:
据我所知,只要字段是您提供的,以下内容就足够了。
INSERT INTO Address (email)
SELECT User.email
FROM User JOIN person ON User.id_person = person.id
WHERE person.id_address IS NULL
;
编辑(使用光标)
使用光标应该很简单,但我强烈建议您熟悉这些及其含义。
DROP PROCEDURE IF EXISTS _tmp_update_address;
DELIMITER $$
CREATE PROCEDURE _tmp_update_address()
BEGIN
DECLARE cursor_List_isdone BOOLEAN DEFAULT FALSE;
DECLARE cur_userId, cur_personId INT;
DECLARE cur_email VARCHAR(250) DEFAULT '';
DECLARE cursor_List CURSOR FOR
SELECT User.id, person.id_address, User.email
FROM User JOIN person ON User.id_person = person.id
WHERE person.id_address IS NULL
;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_List_isdone = TRUE;
OPEN cursor_List;
loop_List: LOOP
FETCH cursor_List INTO cur_userId, cur_personId, cur_email;
IF cursor_List_isdone THEN
LEAVE loop_List;
END IF;
INSERT INTO Address (email) VALUES (cur_email);
UPDATE person SET person.id_address = LAST_INSERT_ID()
WHERE person.id = cur_personId;
END LOOP loop_List;
CLOSE cursor_List;
END
$$
DELIMITER ;
CALL _tmp_update_address();
【讨论】:
【参考方案2】:您不想为此使用光标。根据您的描述:
insert into address (address)
select u.email
from user u join
person p
on u.id_person = p.id;
【讨论】:
【参考方案3】:当我搜索“mysql foreach 循环”时,这就是我发现的,因为我找到了一个比光标更好的替代方法来执行 foreach 循环,我们在这里:
delimiter $$
create or replace procedure _tmp_procedure() begin
for var_user in (
select User.id, person.id_address, User.email
from User join person on User.id_person = person.id
where person.id_address is null
) do
INSERT INTO Address (email) VALUES (var_user.email);
UPDATE person SET person.id_address = LAST_INSERT_ID()
WHERE person.id = var_user.id_person;
end for;
end;
$$
call _tmp_procedure();
【讨论】:
以上是关于MySQL foreach 循环的主要内容,如果未能解决你的问题,请参考以下文章
无法在另一个 foreach mysql C# 中的 foreach 循环中获取 Last_inserted_id