Обновите одну таблицу MySQL значениями из другой - PullRequest
83 голосов
/ 20 апреля 2011

Я пытаюсь обновить одну таблицу MySQL на основе информации из другой.

Моя таблица original выглядит следующим образом:

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

А таблица tobeupdated выглядит следующим образом:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

Я хочу обновить id в tobeupdated с id из original на основе value (строки хранятся в поле VARCHAR(32)).

Будем надеяться, что обновленная таблица будет выглядеть так:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune

У меня есть запрос, который работает, но он очень медленный:

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

Это увеличивает мой ЦП и в конечном итоге приводит к таймаутутолько часть выполненных обновлений (есть несколько тысяч значений для соответствия).Я знаю, что сопоставление на value будет медленным, но это единственные данные, которые я должен сопоставить их вместе.

Есть ли лучший способ для обновления значений, подобных этому?Я мог бы создать третью таблицу для объединенных результатов, если бы это было быстрее?

Я пытался MySQL - Как я могу обновить таблицу значениями из другой таблицы? , но это не такэто действительно помогает.Есть идеи?

Заранее спасибо за помощь новичку MySQL!

Ответы [ 2 ]

183 голосов
/ 20 апреля 2011
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

Это должно сделать это, и в действительности это делает именно то, что у вас Однако я предпочитаю синтаксис «JOIN» для объединений, а не несколько условий «WHERE», я думаю, что его легче читать

Что касается медленной работы, то насколько велики таблицы? У вас должны быть индексы на tobeupdated.value и original.value

EDIT: мы также можем упростить запрос

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USING - это сокращение, когда обе таблицы объединения имеют идентичное имя key, например id. т.е. равное соединение - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join

0 голосов
/ 20 апреля 2011

Это зависит от использования этих таблиц, но вы можете рассмотреть возможность установки триггера на исходную таблицу при вставке и обновлении.Когда вставка или обновление завершены, обновите вторую таблицу на основе только одного элемента из исходной таблицы.Это будет быстрее.

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