如何一次更新一列中的多行?

时间:2015-04-21 08:52:39

标签: mysql stored-procedures

我正在尝试执行一个程序来更新最近添加的(现在)空列。

在这个新专栏中,我将把连接查询获得的结果的值。 为了更好地解释它,我有这个

delimiter // 
create procedure update_amount_products (in id int)
begin
update categories set products_amount= 
           (SELECT DISTINCT COUNT( products_to_categories.products_id ) 
FROM categories_description
INNER JOIN products_to_categories ON products_to_categories.categories_id = categories_description.categories_id
INNER JOIN products_description ON products_description.products_id = products_to_categories.products_id
WHERE categories_description.categories_id =id)
WHERE categories_id = id;
end
//
call update_amount_products(id);

所以我想要的是,不是每次都使用不同的“ids”调用该过程,我想一次更新所有(因为有超过1500行有差异ID)。我该怎么办?

我一直在考虑某种“for”来获取所有id并将它们保存在一个变量中,以后在我的更新过程中使用,但我已经看到sql中没有任何数组可能性也没有foreach 。

修改 我想知道这是否有可能(现在它不起作用)

DELIMITER $$  
CREATE PROCEDURE total_updated()

   BEGIN
      DECLARE a INT Default 1 ;
      DECLARE category_length int;

      select count(categories_id) into category_length from categories_description;

      simple_loop: LOOP
         SET a=a+1;

         call update_amount_products(a);

         IF a >= category_length THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$

由于有关分隔符的一些愚蠢警告,我无法创建最后一个程序(有时甚至在我使用之前工作的相同代码时也会发生这种情况)

  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第19行的“//”附近使用正确的语法

任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:0)

最后,我得到了它,经过几次尝试,我得到了我需要的东西,所以我会分享我的答案。

首先,我做了一个程序来更新列中的一行:

delimiter //
create procedure update_amount_products (in id int)
begin
update categories set products_amount= 
           (SELECT DISTINCT COUNT( products_to_categories.products_id ) 
FROM categories_description
INNER JOIN products_to_categories ON products_to_categories.categories_id = categories_description.categories_id
INNER JOIN products_description ON products_description.products_id = products_to_categories.products_id
WHERE categories_description.categories_id =id)
WHERE categories_id = id;
end
//

DELIMITER ;

然后我意识到我可以通过调用带有循环的另一个过程来处理整个列

DELIMITER $$
CREATE PROCEDURE update_products_amount()

   BEGIN
      DECLARE a INT Default 1 ;
      DECLARE category_length int;

      select max(categories_id) into category_length from categories_description;

      simple_loop: LOOP
         SET a=a+1;

         call update_amount_products(a);

         IF a >= category_length THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$
DELIMITER ;

commit;

最后,我现在要做的就是打电话给我的最后一个程序,我的所有栏目都会自动更新。

call update_products_amount();

答案 1 :(得分:0)

update语句中,您可以引用要更新的实际记录的字段。因此,在您的情况下,您可以参考子选择中的categories_id,并且您不需要将其指定为外部参数。也许您可以考虑这样的简单更新:

UPDATE categories c
SET products_amount =
   (SELECT DISTINCT COUNT( products_to_categories.products_id ) 
    FROM categories_description
    INNER JOIN products_to_categories
       ON products_to_categories.categories_id = categories_description.categories_id
   INNER JOIN products_description
       ON products_description.products_id = products_to_categories.products_id
   WHERE categories_description.categories_id = c.categories_id);

此外,与products_description的联接似乎是不必要的,但如果没有架构,很难说它是肯定的。