среда, 28 апреля 2010 г.

Пример использования REPLACE в MySQL

Предлагаю вашему вниманию пример использования метода REPLACE в MySQL.

Допустим, есть задача: в определенной таблице заменить в некотором поле символ "&" на "-":
Сложный способ:


  UPDATE `table_name` t1, `table_name` t2
  SET t1.`field_name`= REPLACE(t2.`field_name`, '&', '-')
  WHERE t1.id = t2.id


Так как вся работа происходит в одной таблице, то необходимо использовать механизм алиасов для работы с одной таблицей как с двумя. Важным критерием является условие t1.id = t2.id, так как мы должны изменять одно и то же поле.

Или более простой вариант, который работает когда t1.id = t2.id и лишние проверки можно отбросить:

  UPDATE `table_name`
  SET `field_name`= REPLACE(`field_name`, '&', '-');

Сам механизм замены предельно прост:
  REPLACE(имя поля или просто текст, что меняем, на что меняем)

Простое и удобное решение. Надеюсь кому-то пригодится.

20 комментариев:

  1. Хм, а чем плох обычный вариант?
    UPDATE `table_name`
    SET `field_name`= REPLACE(`field_name`, '&', '-');

    ОтветитьУдалить
  2. Можно и обычно. Просто использовал общий подход для выборки.

    ОтветитьУдалить
  3. а как насчет замены по регулярному выражению без использования php?

    ОтветитьУдалить
  4. Ответы
    1. а зачем отвечать вопросом на вопрос? про использование пхп было сказано как в общем случае делают. а как юзать регулярки в мускуле вопрос интереснее

      Удалить
  5. Спасибо! очень пригодился простой вариант.

    ОтветитьУдалить
  6. А что скажите на счет производительности? REPLACE - очень тяжелый?

    ОтветитьУдалить
    Ответы
    1. По скорости в лучшем случае как INSERT, в худшем как DELETE+INSERT.

      Худший случай если найденная строка таблицы до замены и после замены содержит одинаковые (те же самые) значения первичного ключа или уникального индекса (т.е. они не поменялись)

      Удалить
    2. Спасибо друг.

      Удалить
  7. Ребята, а как мне в базе заменить ошибки написанные ранее связанные с экранированными символами, вот пример: текст бла бла бла. \r\nОпять текст бла бла бла \"С новым годом\" бла бла бла...
    Если сделать запрос select * from field where like '%\r\n%' он попросту его не находит (как только не пробовал, работает только '%\\n%' или '%\\r%'

    ОтветитьУдалить
    Ответы
    1. Так правильно, работает потому что нужно экранировать слеши: http://www.mysql.ru/docs/man/String_syntax.html

      Удалить
  8. а каким образом в весь столбец в таблице добавить текстовую информацию в конец уже имеющейся ? т.е. есть текстовое описание, а мне к этому описанию нужно добавить еще одну фразу. может кто подскажеткоманды в phpmyadmin?

    ОтветитьУдалить
    Ответы
    1. UPDATE table_name SET textfield = concat(textfield, 'some text')

      Удалить
    2. И выполнить запрос в phpmyadmin для нужной таблицы `table_name`.
      Рекомендую ознакомиться с докой по строковым функциям в mysql: http://phpclub.ru/mysql/doc/string-functions.html

      Удалить