MySql обновляет две таблицы одновременно - PullRequest
20 голосов
/ 07 января 2012

У меня есть две таблицы, которым для денормализации нужны одинаковые значения.

Вот запрос.

первая таблица

UPDATE Table_One 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 AND lid = 1 LIMIT 1

вторая таблица

UPDATE Table_Two 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 LIMIT 1

Как вы можете видеть, единственная разница между обеими таблицами заключается в их названии, а в таблице два нет поля lid

В любом случае объединить оба обновления в одну?

Ответы [ 4 ]

40 голосов
/ 07 января 2012

Это должно быть возможно при обновлении нескольких таблиц, как описано в документации.

http://dev.mysql.com/doc/refman/5.5/en/update.html

UPDATE Table_One a INNER JOIN Table_Two b ON (a.userid = b.userid)
SET
  a.win = a.win+1, a.streak = a.streak+1, a.score = a.score+200,
  b.win = b.win+1, b.streak = b.streak+1, b.score = b.score+200 
WHERE a.userid = 1 AND a.lid = 1 AND b.userid = 1

Примечание: Multi-таблица не поддерживает LIMIT, поэтомуэто может вызвать больше горя в зависимости от деталей.

Хранимые процедуры или транзакции могут быть лучшим решением.

9 голосов
/ 07 января 2012

Если существует отношение один к одному или один ко многим от Table_One к Table_Two, это будет работать:

UPDATE Table_One T1, Table_Two T2 
SET T1.win = T1.win+1, T1.streak = T1.streak+1, T1.score = T1.score+200, 
    T2.win = T2.win+1, T2.streak = T2.streak+1, T2.score = T2.score+200 
WHERE T1.userid = 1 AND T1.lid = 1 AND T2.userid = T1.userid;
0 голосов
/ 14 ноября 2013

Если вы можете объединить таблицы, то вы можете создать представление двух таблиц, а затем выполнить обновление через это представление. В вашем примере это выглядит так: идентификатор пользователя может быть подходящим ключом.

При создании вида вам необходимо придерживаться , следуя рекомендациям .

0 голосов
/ 07 января 2012

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

Редактировать : следует убрать это; вы можете использовать его для нескольких таблиц, но вы не можете использовать ORDER BY или LIMIT.

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