Mysql: невозможно изменить или обновить столбец для значения даты 0000-00-00

У меня два вопроса:

  1. Почему mysql не может уведомить об ошибке при вставке неправильной даты 0000-00-00, если в определении таблицы ее значение не равно нулю ..?

пример схемы: здесь

Теперь, если изменить duedate на 1970-01-01, появится ошибка.

Incorrect date value 0000-00-00 for the column duedate at row1

update my_list set duedate = '1970-01-01' where duedate = '0000-00-00';

Я попытался изменить столбец, но он по-прежнему показывает ту же ошибку

ALTER TABLE `my_list` modify `duedate` date NULL;
ALTER TABLE  `my_list` MODIFY  `duedate` DATE NOT NULL DEFAULT '1970-01-01';
  1. Как изменить duedate на 1970-01-01 для 0000-00-00;

Я получил базу данных от клиента, поэтому, к сожалению, работаю с файлом my.cnf.

Больше информации:

Версия MYSQL: 5.5

Обновлено: Это работает

update my_list set duedate = '1970-01-01' where id = 16; 

но нет

update my_list set duedate = '1970-01-01' where duedate = '0000-00-00';

Поскольку '0000-00-00' не является правильным значением даты, вы не можете использовать его в своем предложении where. А зачем менять на 1970? NULL - правильное значение без даты

juergen d 04.09.2018 14:16

он работает с использованием select * from my_list where duedate = '0000-00-00';, к сожалению, он не работает в sqlfiddle, но работает в SQL WORK BENCH. Я хотел поменять на 1970

Gabf Hann 04.09.2018 14:18

сделать SET sql_mode = ''; перед вызовом запроса на обновление

Madhur Bhaiya 04.09.2018 14:34
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
3
3 025
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы не можете изменять и обновлять значение даты на «0000-00-00» в качестве фиктивной даты. из-за того, что MySQL позволяет вам хранить «нулевое» значение. Чтобы запретить «0000-00-00», включите режим SQL NO_ZERO_DATE.

Дополнительно должен быть включен строгий режим для запрета «нулевых» значений:

Проверить версию и режим SQL

SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

Отключение режима STRICT_TRANS_TABLES

вам нужно отключить режим STRICT_TRANS_TABLES в файле конфигурации mysql или с помощью команды

По команде

SET sql_mode = '';

или

SET GLOBAL sql_mode = '';

если выше не работает, перейдите в /etc/mysql/my.cnf (согласно ubuntu) и закомментируйте STRICT_TRANS_TABLES

Кроме того, если вы хотите навсегда установить режим sql при запуске сервера, включите SET sql_mode = '' в my.cnf в Linux. Для Windows это нужно сделать в файле my.ini.

если выше не работает, перейдите в /etc/mysql/my.cnf (согласно ubuntu) и закомментируйте STRICT_TRANS_TABLES

Кроме того, если вы хотите навсегда установить режим sql при запуске сервера, включите SET sql_mode = '' в my.cnf в Linux. Для Windows это нужно сделать в файле my.ini.

Примечание

MySQL позволяет вам хранить «нулевое» значение «0000-00-00» в качестве «фиктивной даты». В некоторых случаях это более удобно, чем использование значений NULL, и требует меньше данных и места для индекса. Чтобы запретить «0000-00-00», включите режим SQL NO_ZERO_DATE.

Обновление по поводу NO_ZERO_DATE

Начиная с MySQL 5.7.4 этот режим устарел. Обратитесь к документации MySQL 5.7 на NO_ZERO_DATE

спасибо за объяснение, но, к сожалению, у меня нет надлежащих прав на базу данных для запуска set sql_mode=''; или изменения файла my.cnf.

Gabf Hann 04.09.2018 15:11

Хорошо, я поговорил с клиентом сегодня, и я могу внести изменения в файл my.cnf, и потому что sql_mode установлен в NULL, операторы вставки не проверяли нулевые значения с помощью `STRICT_ALL_TABLES`, теперь я могу убедиться, что данные правильные, и данные будут отклонены при вставке неправильных данных.

Gabf Hann 05.09.2018 15:11

Удаление STRICT_TRANS_TABLES помогло мне решить аналогичную проблему. Оказалось, что настройка среды с последней версией MySQL сильно отличается от устаревшей версии 5.6. Спасибо!

Dan D. 16.04.2020 14:46

Это работает

update my_list
set duedate = '1970-01-01' 
where to_days(duedate)IS NULL

хотя бы в sqlfiddle

спасибо, что вышеупомянутый запрос работает, и я могу изменить дату .. Однако я все еще не понимаю его why does not the insert statement notify an error when inserting wrong date value but it notifies when using update statement?

Gabf Hann 04.09.2018 15:10

Приведите duedate к строке:

update my_list set duedate = '1970-01-01' where DATE_FORMAT(duedate, '%Y-%m-%d') = '0000-00-00';

Этот запрос тоже работает .. я могу изменить дату .. однако why does not the insert statement notify an error when inserting wrong date value but it notifies when using update statement?

Gabf Hann 04.09.2018 15:15

Даже если они похожи, MySql внутренне выполняет две разные операции и, вероятно, не выполняет одну и ту же проверку.

Francesco Simeoli 04.09.2018 15:22

Работает отлично. Ty

MrEduar 28.07.2020 19:55

Другие вопросы по теме