MySQL update join не работает должным образом - PullRequest
0 голосов
/ 15 августа 2011

Я использую MySQL 5.1.41 на Ubuntu 12.10 и MySQL Workbench.

У меня есть 2 таблицы продуктов, t1 и t2.t1 - оперативные данные, а t2 - импортированные данные, готовые к обновлению в t1 для обновления всех новых цен на товары.Итак, я запускаю:

SELECT * FROM t1
JOIN t2 ON t1.id = t2.id
WHERE t1.price != t2.price;

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

UPDATE t1 JOIN t2 ON t1.id = t2.id
SET t1.price = t2.price
WHERE t1.price != t2.price;

Это завершается без ошибок и сообщает об 1143 поврежденных строках, Соответствие строк: 1143 Изменено: 1143 Предупреждения: 0

Так что что-то здесь уже не так.1201 записей были различны в запросе на выборку, но только 1143 изменились с использованием того же соединения и критериев?

При выполнении начального запроса на выборку я бы ожидал увидеть 58 записей, которые по-прежнему имели разные цены.Но при запуске я получаю тот же 1201, что и изначально.Как будто обновления не фиксируются.

Есть идеи?

1 Ответ

5 голосов
/ 15 августа 2011

Число (1201), которое показывает SELECT, - это не записи t1, а строки из JOIN двух таблиц.Если два id не оба UNIQUE или PRIMARY KEY с, то это ожидается.Некоторые строки t1 соответствуют нескольким строкам из t2.Но когда UPDATE выполняется, они обновляются только один раз (это «особенность» MySQL или «ошибка» UPDATE, которая последовательно проверяет условия WHERE во время оператора обновления.

Попробуйтепосмотрите, сколько строк (из t1) должно быть обновлено:

SELECT * FROM t1
WHERE EXISTS
      ( SELECT *
        FROM t2
        WHERE t1.id = t2.id
          AND t1.price != t2.price
      );
...