запрос UPDATE mySQL возвращает "затронутые 0 строк" - PullRequest
17 голосов
/ 02 февраля 2010

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

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

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

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

Ответы [ 10 ]

32 голосов
/ 02 февраля 2010

Как подсказали амфетамин и Яда, уточните у SELECT, находится ли ваш номер телефона в таблице.

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

7 голосов
/ 03 сентября 2014

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

Подводя итог другим стратегиям / идеям из этого поста:

  1. Проверьте с помощью оператора SELECT, работает ли ваш WHERE и возвращает ли он результаты.
  2. Проверьте, есть ли в ваших столбцах значение, которое вы хотите установить.
  3. Проверьте, соответствует ли желаемое значение типу данных столбца.
1 голос
/ 15 сентября 2016

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

1 голос
/ 21 июля 2016

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

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

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

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

1 голос
/ 02 февраля 2010

Возможно, проблема в том, что нет записей с PhoneNumber == "999 29-4655".

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

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

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

0 голосов
/ 04 апреля 2019

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

Но для одной конкретной строки UPDATE не удался - было получено ноль строк.

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

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

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

0 голосов
/ 03 февраля 2010

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

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

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

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

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

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

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

0 голосов
/ 02 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...