Запрос mySQL UPDATE возвращает "0 строк, затронутых"

У меня есть этот запрос:

UPDATE phonecalls 
   SET Called = "Yes" 
 WHERE PhoneNumber = "999 29-4655"

Моя таблица phonecalls, у меня есть столбец с именем PhoneNumber. Все, что я хочу обновить, - это столбец с именем Called на "yes".

Любая идея, что я делаю неправильно? когда я возвращаю свой запрос, он говорит, что пострадали 0 строк.

Ответ 1

Как предложил амфетамин и Яда, проверьте с помощью SELECT, если ваш номер телефона находится в таблице.

Но имейте в виду: если значение для called данной строки уже "Да", mysql не изменит значение и поэтому вернет "0 строк, затронутых". Поэтому не забудьте также проверить текущее значение called

Ответ 2

Другая причина для 0 затронутых строк, которые я наблюдал: неправильный тип данных. Если столбец, который вы хотите обновить, является целым или логическим, и вы установите его в строку, он не будет обновлен, но вы также не получите ошибки.

Подводя итог другим стратегиям/идеям из этой публикации:

  • Проверьте с помощью инструкции SELECT, работает ли ваше WHERE и возвращает результаты.
  • Убедитесь, что у ваших столбцов уже есть значение, которое вы хотите установить.
  • Проверьте, соответствует ли ваше желаемое значение типу данных столбца.

Ответ 3

Проблема может заключаться в отсутствии записей с PhoneNumber == "999 29-4655".

Попробуйте этот запрос:

SELECT * FROM phonecalls where PhoneNumber = '999 29-4655'

Если он ничего не возвращает, то нет строк, которые соответствуют.

Ответ 4

В интересах любого человека из Google эта проблема была вызвана мной, потому что я пытался добавить в пустое поле с помощью CONCAT().

UPDATE example SET data=CONCAT(data, 'more');

Если data - NULL, то CONCAT() возвращает NULL (игнорируя второй параметр), поэтому значение не изменяется (обновление значения NULL должно быть значением NULL), следовательно обновлены 0 строк.

В этом случае вместо функции CONCAT_WS() была исправлена ​​проблема.

Ответ 5

Если значения совпадают, MySQL не будет обновлять строку (без запуска каких-либо предупреждений или ошибок), поэтому количество строк в строке будет 0.

Ответ 6

Попробуйте select count(*) from phonecalls where PhoneNumber = "999 29-4655"; Это даст вам количество совпадающих строк. Если результат равен 0, то в базе данных нет строки, которая соответствует.-

Ответ 7

Убедитесь, что это возвращает некоторый результат.

SELECT * FROM phonecalls WHERE PhoneNumber = '999 29-4655'

Если он не возвращает никакого результата, чем фильтр WHERE PhoneNumber = '999 29-4655' неверен.

Ответ 8

  • Говорят, что строки совпадают: 1 Изменено: 0 Предупреждения: 0? Тогда, возможно, он уже настроен на это значение.
  • Вы пробовали одиночные кавычки или двойные кавычки?
  • "999 29-4655" - это пробел или вкладка и является ли он последовательным в вашем запросе и базе данных?

Ответ 9

Это мое предложение:

UPDATE `phonecalls` SET `Called` = 'yeah!' WHERE `PhoneNumber` = '999 29-4655' AND `Called` != 'yeah!'

И убедитесь в том, что имя таблицы и поля с учетом регистра.

Ответ 10

Просто столкнулся с неясным случаем этого. Наш код читает список записей из базы данных, изменяет столбец и записывает их по очереди. Предложение UPDATE WHERE содержит только два условия: WHERE key=? AND last_update_dt=? WHERE key=? AND last_update_dt=? , (Проверка временной метки предназначена для оптимистической блокировки: если запись изменяется другим процессом до того, как мы напишем нашу, обновляется 0 строк, и мы выдаем ошибку.)

Но для одной конкретной строки UPDATE было failing- нулевых строк произведено.

После долгих потягиваний я заметил, что timestamp для ряда была 2019-03-10 02:59. На большей части территории США эта временная метка не будет exist- переходить на летнее время, поэтому время пропускается напрямую с 2:00 до 3:00. Таким образом, я догадался, что во время обратного пути из MySQL в Java обратно в MySQL некоторая часть кода интерпретировала эту временную метку иначе, чем остальные, что делало временные метки в WHERE не совпадающими.

Изменение метки времени строки на один час позволило избежать проблемы.

(Конечно, правильным решением будет отмена перехода на летнее время. Я создал Jira, но правительство США еще не ответило на него.)

Ответ 11

В моем случае я пытался обновить столбец текста, чтобы исправить с ним проблему усечения. Попытка обновления до правильного текста приводила к 0 rows updated, потому что текст в строке не менялся.

Как только я расширил столбец в структуре таблицы, чтобы он соответствовал правильному количеству символов, я смог увидеть желаемые результаты.