powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Разный подход к WHERE при выборке и обновлении?
8 сообщений из 8, страница 1 из 1
Разный подход к WHERE при выборке и обновлении?
    #39814174
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как обойти "проблему" - в этом нет вопросов, уже решено. Не понимаю, почему ошибка вываливается.

Сервер MySQL 5.7, sql_mode по дефолту.
Поле, которое мучаю, имеет тип DATE, допускается NULL, по дефолту NULL. Движок таблицы MyISAM.

В нынешнее состояние БД пришла после многолетних обновлений с предыдущих версий и сложно даже вспомнить, как именно. Часть строк имеет когда-то дефолтовую дату '0000-00-00', часть новую дефолтовую NULL, ну и реальные даты тоже есть. :)

Хочу привести столбец к единому "пустому" значению, '0000-00-00' заменить на NULL.
Сначала проверка. Запрос
Код: sql
1.
SELECT `contact_birthday`  FROM `contacts` WHERE `contact_birthday` = '0000-00-00'

работает, возвращает сколько-то записей.

А вот обновление
Код: sql
1.
UPDATE `contacts` SET `contact_birthday` = NULL WHERE `contact_birthday` = '0000-00-00'

вываливается с ошибкой
Код: plaintext
#1292 - Incorrect date value: '0000-00-00' for column 'contact_birthday'

Сообразно sql_mode, "нулевая" дата не может быть записана - это понятно. Но ведь в предложении WHERE чтение происходит, а ошибка указывает именно на него. Или при апдейте проверяются на корректность вообще все данные, а не только те, что нужно установить?
...
Рейтинг: 0 / 0
Разный подход к WHERE при выборке и обновлении?
    #39814197
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в качестве бреда
Код: sql
1.
UPDATE `contacts` SET `contact_birthday` = NULL


выдаст ошибку или нет?
...
Рейтинг: 0 / 0
Разный подход к WHERE при выборке и обновлении?
    #39814201
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

Не такой уж и бред. Мне попадались упоминания, что апдейт другого поля в записи, содержащей 0000-00-00, тоже даёт такую же ошибку, хотя в самом запросе не упоминалась ни такая дата, ни поле с такой датой.
...
Рейтинг: 0 / 0
Разный подход к WHERE при выборке и обновлении?
    #39814245
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Вот и у меня в какой-то мере аналогично получилось, чуть раньше потребовалось изменить тип другого поля, и при ALTER вышла ошибка со ссылкой на некорректные данные в `contact_birthday`.
...
Рейтинг: 0 / 0
Разный подход к WHERE при выборке и обновлении?
    #39814246
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгенийвыдаст ошибку или нет?Это сейчас уже только на кошках, из бэкапа поднимать таблицу...
...
Рейтинг: 0 / 0
Разный подход к WHERE при выборке и обновлении?
    #39814289
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, забыл же в первом посту решение написать, которое сработало без ошибки. Это при дефолтовом же sql_mode, не трогал его.
Код: sql
1.
UPDATE `contacts` SET `contact_birthday` = NULL WHERE `contact_birthday` = 0
...
Рейтинг: 0 / 0
Разный подход к WHERE при выборке и обновлении?
    #39814327
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle
Код: sql
1.
UPDATE `contacts` SET `contact_birthday` = NULL WHERE `contact_birthday`< '1900-01-01'

а так?
...
Рейтинг: 0 / 0
Разный подход к WHERE при выборке и обновлении?
    #39814595
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений
Код: sql
1.
UPDATE `contacts` SET `contact_birthday` = NULL



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
root@localhost [test]> select count(1) from `contacts`;
+----------+
| count(1) |
+----------+
|      527 |
+----------+
1 row in set (0.00 sec)

root@localhost [test]> select count(1) from `contacts` where `contact_birthday` = '0000-00-00';
+----------+
| count(1) |
+----------+
|      115 |
+----------+
1 row in set, 1 warning (0.00 sec)

root@localhost [test]> UPDATE `contacts` SET `contact_birthday` = NULL;
Query OK, 122 rows affected (0.01 sec)
Rows matched: 527  Changed: 122  Warnings: 0




miksoftvkle
Код: sql
1.
UPDATE `contacts` SET `contact_birthday` = NULL WHERE `contact_birthday`< '1900-01-01'


а так?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
root@localhost [test]> select count(1) from `contacts` where `contact_birthday` = '0000-00-00';
+----------+
| count(1) |
+----------+
|        0 |
+----------+
1 row in set, 1 warning (0.00 sec)

root@localhost [test]> UPDATE `contacts` SET `contact_birthday` = NULL WHERE `contact_birthday`< '1900-01-01';
Query OK, 115 rows affected (0.01 sec)
Rows matched: 115  Changed: 115  Warnings: 0



И так и эдак ошибок нет.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Разный подход к WHERE при выборке и обновлении?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]