Обновить несколько таблиц в одном запросе - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть 2 таблицы в mysql (Версия: mysql 5.7.24), например:

table1                                   table2
    ------------------------------------------------------

     Name                                Name     Family
    ------                              -----------------

    Ali                                  Reza      Tab

    Hamid                                Ali       Rtg 

Я хочу обновить Name столбец в двух таблицах в 1 запросе, поэтому используйте эту команду :

$query = "
UPDATE table1
     , table2 
   SET table1.Name = 'hhh'
     , table2.Name = 'hhh' 
 WHERE table1.Name ='Hamid' 
   AND table2.Name = 'Hamid';

Я ожидаю, что таблица1 будет обновлена, но ни одна из таблиц не будет обновлена. Почему?

Если используется WHERE table1.Name ='Ali' AND table2.Name ='Ali'; вместо WHERE table1.Name ='Hamid' AND table2.Name ='Hamid';, обе таблицы обновляются

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Измените оператор AND на OR в предложении WHERE и используйте функцию IF() для выполнения UPDATE:

UPDATE table1, table2
SET 
  table1.Name = IF(table1.Name = 'Hamid', 'hhh', table1.Name),
  table2.Name = IF(table2.Name = 'Hamid', 'hhh', table2.Name)
WHERE table1.Name = 'Hamid' OR table2.Name = 'Hamid';

См. Демонстрационную версию , Результаты: table1

| Name |
| ---- |
| Ali  |
| hhh  |

table2

| Name | Family |
| ---- | ------ |
| Reza | Tab    |
| Ali  | Rtg    |
2 голосов
/ 11 февраля 2020

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

Вам необходимо использовать LEFT JOIN.

UPDATE table1
LEFT JOIN table2 ON table2.Name = table1.Name
SET table1.Name = 'hhh', table2.Name = 'hhh'
WHERE table1.Name = 'Hamid'

Я предполагаю, что table1 является основной таблицей и table2 является зависимой таблицей.

Если это внешний ключ, вы можете использовать ON UPDATE CASCADE в спецификации внешнего ключа. Тогда вам нужно только обновить table1, и он автоматически перейдет к table2.

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