#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 в первую очередь.