MySQL, обновление нескольких таблиц и странный результат - PullRequest
1 голос
/ 10 февраля 2011

У меня есть две таблицы:

TEST1:

id int, value int, parentId int

и TEST2:

id int, value int, parentId int

В TEST1 у меня есть следующие записи:

 id  value  parentId
 1   0      1
 2   0      1
 3   0      1

в TEST2 у меня есть:

id  value  parentId
1   0      1

Я хочу обновить две таблицы в одном обновлении, используя функцию нескольких таблиц.Цель состоит в том, чтобы добавить +1 значение к каждой записи TEST1 и +1 значение к записи в TEST2, где parentId аналогичен TEST1.

Мой запрос:

UPDATE TEST1 t1
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId
SET t1.value = t1.value + 1,
    t2.value = t2.value + 1;

Послечто, я делаю выбор, чтобы проверить, что значения TEST1 были обновлены:

SELECT * FROM TEST1;

Это дает мне:

id  value  parentId
1   1      1
2   1      1
3   1      1

Я проверяю TEST2:

SELECT * FROM TEST2;

Это дает мне:

id  value  parentId
1   1      1

Что я нахожу странным, так это то, что запись TEST2 имеет значение 1. Я ожидаю 3, потому что обновление TEST1 выполняется на 3 записях, и поэтому обновление TEST2 должнопроисходит три раза на одной и той же записи.

Почему я получаю 1 вместо 3?и Какой правильный запрос для получения 3?

РЕДАКТИРОВАТЬ: Я также пытался:

SET @var=1;

UPDATE TEST1 t1
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId
SET t1.value = t1.value + 1,
    t2.value = (@var:= @var + 1);

После этого запроса t2.value равно 2!И не 4, как я ожидал.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2011

Возможно, я здесь не прав, но до завершения запроса ваш оператор обновления будет видеть значение t1.value как 0 (потому что ваш запрос не завершил выполнение), что является ожидаемым поведением, не так ли?

0 голосов
/ 10 февраля 2011

это будет делать то, что вы хотите.Он присоединяется к TEST1 и TEST2, как вы.Дополнительное соединение в подзапросе с именем agg с агрегацией суммы по TEST1.

UPDATE TEST1 t1
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId
LEFT OUTER JOIN (
  SELECT 
    parentId,
    sum(value) AS sum_v
  FROM TEST1
  GROUP BY parentId
) agg ON t1.parentId=agg.parentId
SET t1.value = t1.value + 1,
    t2.value = t2.value + agg.sum_v;
0 голосов
/ 10 февраля 2011

, пожалуйста, попробуйте ПРАВИЛЬНО НАРУЖНОЕ СОЕДИНЕНИЕ вместо ВЛЕВО

...