MySQL的foreach循环

10

我需要在MySQL中迭代表User中的每一行。对于每次迭代,我需要创建一个新的Address行,并满足以下条件:

我有3个表:

User: id, stuff, id_person, email
Person: id, stuff, id_address
Address: id, email

如果User.id_person不为空且person.id_address为空,我需要在地址(Address)中创建新行。我必须使用与User.email相同的电子邮件创建该行。我必须对每个User行执行此操作。 我尝试使用MySQL游标,但我不太了解如何使用它们。 我该如何做?除了使用游标之外,还有其他方法吗? 提前致谢。 编辑:我刚刚意识到我还必须使用刚刚创建的地址行的ID更新person.id_address。

查找 INSERT ,,, FROM SELECT。如果您可以构建一个 SELECT 语句,该语句会导致插入到 Address 中所需的“行”,那么就不必使用 foreach 循环来完成任务。 - Sloan Thrasher
你能发一下你尝试过的代码吗?最好带上光标。这应该是一个相当简单的任务。如果我正确地分析了你的数据,我认为不需要迭代,只需使用带有条件语句的简单的INSERT INTO就足够了。 - Napoli
3个回答

25

据我所了解,只要字段与您提供的相符,下面的内容应该就足够了。

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();

4
当我搜索“mysql foreach loop”时,我发现了以下内容。由于我找到了一个比游标更好的方法来执行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中不起作用。 - Parthanon
1
哎呀,我的错。我可能使用了MariaDB的语法(•〜•) - John
3
我在这里寻找一个循环,使用Mariadb,但只找到了复杂的东西,非常感谢你,你帮我省去了很多工作和复杂的东西 :) - StefanBD

2
您不需要使用游标来完成这个操作。根据您的描述:
insert into address (address)
    select u.email
    from user u join
         person p
         on u.id_person = p.id;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接