MySQL foreach 循环

MySQL foreach loop

我必须遍历 table 用户 MySQL 中的每一行。 我需要为用户中的每个迭代创建一个新的行地址,条件如下所述。

我有 3 个 table:

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

如果 User.id_person 不是 NULL 并且 person.id_address 是 NULL,我需要在地址中创建一个新行。 我必须使用与 User.email 相同的电子邮件创建行。 我必须为用户中的每一行执行此操作。

我尝试使用 MySQL 游标,但我不知道如何很好地使用它们。

我该怎么做?除了使用游标,还有其他方法吗?

提前致谢。

编辑:我刚刚意识到我还必须使用我刚刚创建的地址行的 ID 更新 person.id_address。

您不想为此使用游标。根据您的描述:

insert into address (address)
    select u.email
    from user u join
         person p
         on u.id_person = p.id;

据我所知,只要字段是您提供的,以下内容就足够了。

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

当我搜索“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();