2015-08-12 3 views
4

Я пытаюсь снять теги HTML из всех моих записей непосредственно через MySQL. Благодаря StackOverflow-х this question, я нашел следующую функцию, которая делает вид Газа HTML-теги -Как запустить функцию mySQL для обновления всех строк?

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>'); 

Но я не могу выяснить, как использовать эту функцию, чтобы обновить все записи. Напр. У меня есть записи в столбце AddressmyTable, из которого я хочу снять теги HTML, используя вышеупомянутую функцию. Как я могу напрямую обновлять все записи столбца Address с помощью указанной функции, или если прямое обновление невозможно, то любой способ вставить все обновленные записи во второй столбец таблицы Address_Stripped?

P.S., я знаю, в моем вопросе не было проведено никакого исследования, чтобы получить ответ сам, но это просто потому, что я не знаю, как его искать.

ответ

5

Вам просто нужно вызвать эту функцию в update заявления:

UPDATE mytable 
SET address = fnStripTags(address) 
+0

Спасибо. Это сработало. SO timelimit мешает мне принять его в качестве ответа (осталось 8 минут, чтобы принять его как ответ) –

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 

(вы можете использовать любой подходящий предел)

+0

Спасибо за ваш ответ. Японял твою точку зрения. Но я уже принял ответ (который на самом деле правильный, просто у вас есть дополнительная информация.) Ок. в то же время вы разместили его. Продвиньтесь от меня :) –

Смежные вопросы