Timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP может быть нулевой на одной машине, но не другой?
У меня есть таблица MySql с полем, определенным как:
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
На моей локальной машине я могу запустить:
INSERT INTO mytbl (id, user_id, created) VALUES(88882341234, 765, null);
SELECT id, user_id, created FROM mytbl WHERE id = '88882341234';
И тогда "created" будет показывать что-то вроде "2014-06-13 21:16:42".
Но на моем промежуточном сервере, если я запускаю те же запросы, я получаю эту ошибку:
Column 'created' cannot be null.
Схемы таблиц одинаковы (по локальной и промежуточной), которые я обеспечил с помощью mysqldump (чтобы клонировать таблицу перед запуском этого теста).
Я запускаю MySql 5.6.17 на обеих машинах. Я также гарантировал, что оба имеют один и тот же sql_mode.
В чем может быть проблема?
P.S. Для людей, которые не знают, почему я устанавливаю значение null-nullable для null, MySql Docs говорят:
Кроме того, вы можете инициализировать или обновить любой столбец TIMESTAMP до текущую дату и время, присвоив ему значение NULL, если оно не было определяемый атрибутом NULL для разрешения значений NULL.
Ответы
Ответ 1
Я понял, в чем проблема. Переменная/параметр MySql explicit_defaults_for_timestamp
была отключена на моей локальной машине, но на моей удаленной машине.
Я посетил мою страницу групп параметров AWS RDS и изменил значение explicit_defaults_for_timestamp с 1 на 0.
Затем я перешел на страницу экземпляров AWS RDS, чтобы посмотреть, когда "Группа параметров" изменилась с "Применить" на "Ожидание-перезагрузка".
Затем я перезагрузил конкретный экземпляр.
Эти ссылки помогли мне:
Ответ 2
Основная проблема заключается в том, что INSERT
просто неверно: он пытается вставить NULL
в столбцы с недействительными значениями.
Что вам следует делать, просто исправить запрос:
INSERT INTO mytbl (id, user_id) VALUES(88882341234, 765);
Причина, по которой возникает ошибка только на промежуточном сервере, заключается в том, что сервер работает в строгом режиме SQL и поэтому немедленно прерывается, когда вы пытаетесь вставьте неправильное значение в created
.
Вы можете легко проверить режим SQL, действующий с помощью SELECT @@SESSION.sql_mode
, и изменить его (возможно, чтобы вы могли воспроизвести ошибку на своем собственном сервере) с помощью
SET SESSION sql_mode = 'STRICT_ALL_TABLES'