我有一个场景,我必须对某些文本执行过多的更新(大多数是64k文本类型字段,但也可能是一些中等文本字段,我认为可以包含4MB?)字段(基本上,搜索并替换这些字段。)
以下是我知道如何操作的方式,但我不确定这是否是最佳方法。
一般来说,使用PHP和MySql,我会做这样的事情(SQL代码没有包含在PHP代码中,但你明白了):
SELECT id, some_text_row FROM table WHERE some_text_row LIKE '%some phrase%'
这可能会返回数万行。
接下来,我会做这样的事情:
$row['some_text_row'] = str_replace( 'some phrase',
'some other phrase',
$row['some_text_row'] );
UPDATE table
SET some_text_row = "{$row['some_text_row']}"
WHERE id="{$row['id']'}"
LIMIT 1;
正如我所说,这可能是成千上万的更新。
没有大量更新的经验,我想知道是否有更好的方法,或者,如果数万行不是真正的问题(在在哪种情况下,问题是,有多少行是一个问题。)
感谢。
答案 0 :(得分:3)
我不是SQL专家,但你可能想看看MySQL string functions。它们可能允许您在SQL语句中执行所有操作(因为您只是在进行替换)。
类似的东西:
UPDATE `table`
SET some_text_row = replace(some_text_row, 'some phrase', 'some other phrase')
WHERE some_text_row LIKE '%some phrase%';
答案 1 :(得分:0)
如果您正在执行高峰使用,则需要批量执行更新。
分成1000个单位批次。
答案 2 :(得分:0)
如果要合并UPDATE语句,可以始终批量插入临时表,然后在单个语句中从临时表中更新现有表。
e.g:
CREATE TEMPORARY TABLE my_tmp (id INTEGER, new_value TEXT);
INSERT INTO my_tmp VALUES (1, 'new string'), (2, 'another new string'), ...;
UPDATE table SET some_text_row = new_value FROM my_tmp WHERE my_tmp.id = table.id;
如果您正在查看成千上万的更新,这可能会为您在往返,查询解析等方面节省大量时间。
如果你能在纯SQL中做到你需要的东西,Tim的解决方案绝对优越。但有时您需要对数千行执行转换,这些行比SQL中合理的行更复杂,在这种情况下,此策略可能更为可取。