【发布时间】:2016-06-15 16:51:37
【问题描述】:
绝望地停留在以下问题上,直到现在我的编程快速拨号伙伴都无法提供帮助(他们中的大多数不是 MySQL 专家):
我有不同的表,其中列名和数据类型是使用 CSV 文件从“导入表数据向导”自动生成的,并且该表不包含 AUTO INCREMENT 列(还)。这个特定的表包含大约:30.000 行它从一个看起来像这样的表的 row=id(1) 开始:
我正在尝试使用一个“更正”表来更正 comma delimited 列中的值。为此,我正在编写一个包含 WHILE 循环的存储过程,以逐行遍历更正表,并检查在导入的表中是否找到别名。
| id | material | alias01 | alias02 | alias03 | *up to 12
1 Katoen Cotton Supima Pima
2 Polyester Polyster
3 Lyocell Lycocell Lyocel
4 Linnen Linen
5 Viscose Visose Viskose Viscoe Voscose
6 Scheerwol
7 Polyamide
8 Nylon
9 Leer Leder Lamsleder Varkensleder
10 Polyurethaan Polyurethan PU Polyuretaan
出于测试目的来测试任何类型的结果,我现在只使用 alias01(它需要检查 alias01,然后是 02 等……但我会在稍后尝试解决这个问题)。
它需要比较 `Length' ( alias_string_length = found_string_length) 以确保在 'wool' 或 'wol' 中没有找到包含 'wo' 的字符串。
需要更正的列中的值如下所示(逗号不需要在那里,这正是我被赋予使用的内容):
| material |
,Katoen,Elastaan,Voering,Acetaat,Polyester
,Nylon,Polyester,Elastaan
,Katoen
,Leder,in,Leder,Loopzool,Leder
,Polyester
,Polyester,Elastaan,Voering,Polyester
更新
感谢 Drew 的提示,我更改了程序。我添加了一个 tmp 表,其中包含材料和每行的唯一 ID,并使用 alias01 遍历每个表。完成 9000 行大约需要 11 秒,但 0 row(s) affected,。任何有关提高速度的提示都非常受欢迎,但深入了解可能存在的问题会大有帮助。
CREATE DEFINER=`root`@`localhost` PROCEDURE `replace_materials`()
BEGIN
set @rownumber = 1;
set @totalrows = 28;
set @um ='';
set @cm ='';
set @corrected ='';
set @correctme ='';
TRUNCATE TABLE tmp;
INSERT INTO tmp (material) SELECT material FROM vantilburgonline.productinfo;
WHILE (@rownumber < @totalrows) DO
SET @um = (SELECT alias01 FROM vantilburgonline.materials WHERE id=@rownumber);
-- gives 'um' value from column alias01, from table materials, row(X)
SET @cm = (SELECT material FROM vantilburgonline.materials WHERE id=@rownumber);
-- gives 'cm' value from column material, from table materials, row(X)
set @tmprow = 1;
set @totaltmprow =9000;
WHILE (@tmprow < @totaltmprow) DO
SET @correctme = (SELECT material FROM vantilburgonline.tmp WHERE id = @tmprow);
-- gives the value from column material from table tmp to correctme(X).
SET @correctme = REPLACE(@correctme,@um,@cm);
-- should run through column material from table productinfo and replace 'alias01' with correct 'material'.
SET @tmprow = @tmprow +1;
END WHILE;
SET @rownumber = @rownumber +1;
END WHILE;
END
虽然我确定 alias01 包含它应该在材料中找到的字符串。工作台此时也使用了 9GB,我只能通过重新启动来解决这个问题..
【问题讨论】:
-
当您说 set x=y 并且 y 可以不止一件事时,总是会发生此错误。因此,您的
where子句不会将其缩减为 1 或无。 -
我明白了。一种方法是创建一个填充材料的临时表并添加一个自动增量 id,并在当前的 while 循环中为其创建一个 while 循环以迭代它吗?
-
我只是说,如果你想插入一个变量,返回的内容必须是 0 或 1 行最大值。 0 允许使用 null 或
ifnull()。您如何处理您的特定情况,了解您的数据,这取决于您。 -
该变量旨在包含材料列中的一个字段。由于缺乏 SQL 经验,我猜我忽略了放入整个专栏。不知道为什么没有行受到影响。
-
好吧,您可以调试它并找出答案:p 只需开始触发请求,例如,在循环运行 1 中,看看计数是多少。
标签: mysql stored-procedures iteration mysql-workbench do-while