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!
Ответы
Ответ 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
, в отличие от синтаксиса для одной таблицы.