MySQL обновляет поля на основе значения в другом поле - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно обновить поле на основе наличия строки в другом поле.Мне нужно сделать это для сотен строк поиска.Это то, что я имею до сих пор:

SET SQL_SAFE_UPDATES=0;

UPDATE business_table
SET `chain` = '7-Eleven'
WHERE business_name LIKE BINARY '%7-Eleven%' OR business_name LIKE 
BINARY '%7 Eleven%';

UPDATE business_table
SET `chain` = 'A&W'
WHERE business_name LIKE '%A & W%' OR business_name LIKE '%A&W%';

UPDATE business_table
SET `chain` = 'Blenz Coffee'
WHERE business_name LIKE BINARY '%Blenz Coffee%';

UPDATE business_table
SET `chain` = 'Booster Juice'
WHERE business_name LIKE BINARY '%Booster Juice%';

UPDATE business_table
SET `chain` = 'Boston Pizza'
WHERE business_name LIKE BINARY '%Boston Pizza%';

SET SQL_SAFE_UPDATES=1;

Есть ли более эффективный способ сделать это?Я попытался поместить это в хранимую процедуру без отключения SQL_SAFE-UPDATES следующим образом:

UPDATE business_table b
SET `chain` = '7-Eleven'
WHERE b.id = (SELECT id FROM b WHERE business_name LIKE BINARY '%7-Eleven%' OR business_name LIKE BINARY '%7 Eleven%');

Я получаю эту ошибку:

Error Code: 1093. You can't specify target table 'b' for update in FROM clause

Итак, я понимаю, что это за ошибка, но я не понимаюне знаю, как обойти это в моем случае;с сотнями утверждений ОБНОВЛЕНИЕ.

Идеи?

1 Ответ

0 голосов
/ 12 октября 2018

Да, но только потому, что ваши update требуют полного сканирования таблицы.Использование like с подстановочными знаками в начале шаблона предотвращает любую полезную индексацию.

Итак, вы можете сделать:

UPDATE business_table
    SET chain = (CASE WHEN business_name LIKE BINARY '%7-Eleven%' OR business_name LIKE 
BINARY '%7 Eleven%' THEN '7-Eleven'
                      WHEN (business_name LIKE '%A & W%' OR business_name LIKE '%A&W%') THEN 'A&W'
                      . . .
                 END)
    WHERE (business_name LIKE BINARY '%7-Eleven%' OR business_name LIKE 
BINARY '%7 Eleven%') OR
          (business_name LIKE '%A & W%' OR business_name LIKE '%A&W%') OR
          . . .

Вам необходимо заполнить остальные условияв WHERE и условия в CASE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...