如何用运行mySQL函数更新所有行?
How to run mySQL function to update all rows?
我正在尝试通过 MySQL 直接从我的所有记录中删除 HTML 标签。多亏了 Whosebug 的 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>');
但我无法找到如何使用此功能更新所有记录。例如我在 myTable
的 Address
列中有记录,我想使用上述函数从中删除 HTML 标签。 如何借助上述函数直接更新 Address
列的所有记录,或者如果无法直接更新,则可以通过任何方式将所有更新的记录插入 table Address_Stripped
?
P.S.,我知道,我的问题没有任何研究可以自己得到答案,但这只是因为我不知道如何搜索它。
你只需要在update
语句中调用这个函数:
UPDATE mytable
SET address = fnStripTags(address)
这取决于您应该更新多少行,以及您能否在更新时间锁定整个 table。
如果table比较小或者可以锁定更新时间:
UPDATE table_name
SET address = fnStripTags(address)
并且如果 table 很大 and/or 你不能在整个更新时间内锁定 table - 你应该按块循环执行这些更新
ORDER BY primary_key
UPDATE table_name
SET address = fnStripTags(address)
WHERE primary_key > <previous_value>
ORDER BY primary_key
LIMIT 1000
(你可以使用任何 suitable 限制)
我正在尝试通过 MySQL 直接从我的所有记录中删除 HTML 标签。多亏了 Whosebug 的 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>');
但我无法找到如何使用此功能更新所有记录。例如我在 myTable
的 Address
列中有记录,我想使用上述函数从中删除 HTML 标签。 如何借助上述函数直接更新 Address
列的所有记录,或者如果无法直接更新,则可以通过任何方式将所有更新的记录插入 table Address_Stripped
?
P.S.,我知道,我的问题没有任何研究可以自己得到答案,但这只是因为我不知道如何搜索它。
你只需要在update
语句中调用这个函数:
UPDATE mytable
SET address = fnStripTags(address)
这取决于您应该更新多少行,以及您能否在更新时间锁定整个 table。
如果table比较小或者可以锁定更新时间:
UPDATE table_name
SET address = fnStripTags(address)
并且如果 table 很大 and/or 你不能在整个更新时间内锁定 table - 你应该按块循环执行这些更新
ORDER BY primary_key
UPDATE table_name
SET address = fnStripTags(address)
WHERE primary_key > <previous_value>
ORDER BY primary_key
LIMIT 1000
(你可以使用任何 suitable 限制)