mysql_affected_rows() возвращает 1 при ‘реальной’ ЗАМЕНЕ В

#mysql #replace

#mysql #заменить

Вопрос:

У меня есть таблица MySQL с одним первичным ключом.

Каждую ночь я запускаю задание для вставки и обновления записей. Я использую REPLACE INTO для каждой операции, поэтому она либо добавит, либо заменит существующую строку.

После REPLACE INTO запроса, который я вызываю mysql_affected_rows() , который возвращает количество 1 для многих строк, которые фактически заменены, а не ‘new’ (он возвращает 2 для подавляющего большинства строк, которые заменяются).

Я знаю, что некоторые из этих «вставок» являются ложными, потому что я отслеживаю количество строк в начале и в конце пакетного обновления; в таблице нет дубликатов, чтобы исключить это количество, плюс я проверил, что поддельные «новые» строки существовали до пакетного обновления.

В этой таблице нет ничего особенного; аналогичная таблица работает так же, как и с тем же кодом. У кого-нибудь есть какие-либо идеи, почему mysql_affected_rows() возвращает 1 для операции, которая на самом деле является заменой, а не вставкой?

Ответ №1:

ЗАМЕНА В на самом деле выполняет УДАЛЕНИЕ, а затем ВСТАВКУ, а не ОБНОВЛЕНИЕ.

Возможно, вы захотите рассмотреть возможность использования INSERT … ПРИ ДУБЛИРОВАНИИ КЛЮЧА вместо этого ОБНОВИТЕ синтаксис.

Комментарии:

1. Я знаю, что REPLACE удаляет / вставляет, если строка уже существует, и это то, что ставит меня в тупик — почему mysql_affected_rows () возвращает 1, когда он явно должен возвращать 2? Как я упоминал, этот код работает с идентичной таблицей, поэтому я теряюсь, пытаясь выяснить, почему mysql_affected_rows() возвращает 1. Я мог бы использовать при ДУБЛИРОВАНИИ, но для этого потребовались бы все метки столбцов и значений дважды — один раз для ВСТАВКИ В amp; для при ДУБЛИРОВАНИИ. С более чем 600 столбцами это много. Я могу вычислить изменения между столбцами, но для этого потребовалось бы выполнить SELECT, лишив смысла использовать REPLACE в первую очередь.