Подтвердить что ты не робот

MySQL обновляет объединенную таблицу

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

Фиктивный пример того, что я хотел бы сделать, это что-то вроде:

UPDATE b
FROM tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

Здесь есть много сообщений об обновлении с объединениями, однако в них всегда есть обновляемая таблица. Я знаю, что это возможно в SQL Server и, надеюсь, это возможно в MySQL Too!

4b9b3361

Ответ 1

Синтаксис UPDATE для нескольких таблиц в MySQL отличается от Microsoft SQL Server. Вам не нужно указывать, какие таблицы вы обновляете, что подразумевается в предложении SET.

UPDATE tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

В синтаксисе MySQL отсутствует предложение FROM.

ОБНОВЛЕНИЕ с JOIN не является стандартным SQL, и MySQL и Microsoft SQL Server реализовали свои собственные идеи в качестве расширения стандартного синтаксиса.

Ответ 2

У вас неправильный порядок заявлений. Вы можете прочитать синтаксис здесь (я знаю, его довольно трудно прочитать.

UPDATE tableA a
  JOIN tableB b
    ON a.a_id = b.a_id
  JOIN tableC c
    ON b.b_id = c.b_id
   SET b.val = a.val+c.val
 WHERE a.val > 10
   AND c.val > 10;

sql скрипта

Ответ 3

Эта ссылка должна предоставить вам синтаксис, который требуется MySQL, и здесь является примером. Зачем вам нужно присоединяться к двум таблицам? это ограничить обновление записей? Я спрашиваю, потому что вы также можете сделать что-то вроде следующего:

update B set B.x=<value>
    where 
B.<value> is in(
    select A.y 
      from A left outer join B on A.<value>=B.<value>
)

Ответ 4

Еще одна правильная конструкция, которую мы можем использовать в этой ситуации:

UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2, 
    T2.C3 = expr
WHERE condition

Приведенный выше пример взят из: ОБНОВЛЕНИЕ MySQL.

В Справочном руководстве по MySQL 8.0 мы найдем такое описание синтаксиса UPDATE для нескольких таблиц:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET assignment_list
[WHERE where_condition]

Предложение table_references перечисляет таблицы, включенные в join.

Таким образом, синтаксис MySQL для нескольких таблиц не поддерживает предложения FROM, ORDER BY или LIMIT, в отличие от синтаксиса для одной таблицы.