Редко когда, но всё же приходится делать в базе данных одиночные запросы по перемещению существующих данных из одной таблицы в другую. И если с добавлением рядов используя INSERT проблем возникает мало, то с обновлением существующих таблиц у меня возникла трудность. А именно — была старая таблица Invision Powerboard форума, и имелась новая таблица пользователей, с одинаковыми пользователями.

Хотелось перенести поля из одной таблицы в другую. В самом худшем случае можно было написать цикл в php, где ряд за рядом делался бы одиночный UPDATE. Но поскольку лень — лучшая мотивация человечества к прогрессу, то по принципу наименьшего сопротивления пришлось обойтись таким запросом..

UPDATE sys_users
SET avatar = ( SELECT ibf_members.avatar
                            FROM ibf_members
                            WHERE sys_users.login = ibf_members.name LIMIT 0,1)
WHERE EXISTS ( SELECT 1
                                FROM ibf_members
                                WHERE sys_users.login = ibf_members.name )

Если интересно, то EXISTS выражение нужно только для возможности использования подзапроса, связывающего обе таблицы, раз уж в обычном UPDATE нельзя использовать несколько таблиц, единица это первое поле, а LIMIT нужен на случай дубликатов.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *