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 循环的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 动态sql foreach 使用案例

无法在另一个 foreach mysql C# 中的 foreach 循环中获取 Last_inserted_id

PHP / MYSQL 插入数组 Foreach 循环

MySQL foreach 循环

如何在 PHP 的 foreach 循环中优化大型 mySQL?

使用 PHP 数组输出 MySQL 查询 - foreach 循环错误“非法偏移”和“无效参数”