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

时间:2015-08-12 07:27:30

标签: mysql sql sql-update sql-function

我试图直接通过MySQL从我的所有记录中删除HTML标记。感谢StackOverflow的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>');

但我无法找到,如何使用此功能更新所有记录。对于例如我在Address的{​​{1}}列中有记录,我想使用上述功能从中删除HTML标记。 如何在上述功能的帮助下直接更新myTable列的所有记录,或者如果无法直接更新,则可以任何方式在表的第2列中插入所有更新的记录{{ 1}}吗

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

2 个答案:

答案 0 :(得分:6)

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

UPDATE mytable
SET    address = fnStripTags(address)

答案 1 :(得分:3)

这取决于您应该更新多少行,并且可以或不可以锁定整个表的更新时间。

如果表格相当小或可以在更新时间内锁定:

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

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