如何运行 mySQL 函数来更新所有行?

Posted

技术标签:

【中文标题】如何运行 mySQL 函数来更新所有行?【英文标题】:How to run mySQL function to update all rows? 【发布时间】:2015-11-04 16:12:59 【问题描述】:

我正在尝试直接通过 mysql 从我的所有记录中删除 html 标记。感谢 *** 的 this question,我找到了以下函数,这种函数确实会去除 html 标签 -

SET GLOBAL log_bin_trust_function_creators=1;
DROP FUNCTION IF EXISTS fnStripTags;
DELIMITER |
CREATE FUNCTION fnStripTags( Dirty varchar(4000) )
RETURNS varchar(4000)
DETERMINISTIC 
BEGIN
  DECLARE iStart, iEnd, iLength int;
    WHILE Locate( '<', Dirty ) > 0 And Locate( '>', Dirty, Locate( '<', Dirty )) > 0 DO
      BEGIN
        SET iStart = Locate( '<', Dirty ), iEnd = Locate( '>', Dirty, Locate('<', Dirty ));
        SET iLength = ( iEnd - iStart) + 1;
        IF iLength > 0 THEN
          BEGIN
            SET Dirty = Insert( Dirty, iStart, iLength, '');
          END;
        END IF;
      END;
    END WHILE;
    RETURN Dirty;
END;
|
DELIMITER ;
SELECT fnStripTags('this <html>is <b>a test</b>, nothing more</html>');

但我无法找到,如何使用此功能更新所有记录。例如我在myTableAddress 列中有记录,我想使用上述函数从中删除 HTML 标签。 如何在上述函数的帮助下直接更新Address 列的所有记录,或者如果无法直接更新,那么有什么方法可以将所有更新的记录插入到表Address_Stripped 的第二列中?

P.S.,我知道,我的问题没有自己做任何研究来得到答案,但这仅仅是因为我不知道如何搜索它。

【问题讨论】:

【参考方案1】:

这取决于您应该更新多少行,以及您能否在更新时间内锁定整个表。

如果表比较小或者可以锁定更新时间:

UPDATE table_name
SET    address = fnStripTags(address)

如果表很大并且/或者你不能在整个更新时间内锁定表 - 你应该循环执行这些更新,按块 ORDER BY primary_key

UPDATE table_name
SET    address = fnStripTags(address)
WHERE primary_key > <previous_value>
ORDER BY primary_key
LIMIT 1000

(你可以使用任何合适的限制)

【讨论】:

感谢您的回答。我明白你的意思了。但我已经接受了答案(这实际上是正确的,只是你的答案有附加信息。)在你发布它的同时。给我点赞:)【参考方案2】:

您只需在update 语句中调用此函数:

UPDATE mytable
SET    address = fnStripTags(address)

【讨论】:

谢谢。有效。所以时间限制阻止我接受它作为答案(剩下 8 分钟接受作为答案)

以上是关于如何运行 mySQL 函数来更新所有行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MySQL 中的每一行动态更新所有行? [复制]

Mysql如何使用count函数更新n行?

如何遍历所有行和特定列来计算函数?

如何更新mysql数据库中的数千行

如何获取 MySQL 中最后更新行的 ID?

如何加密整个列