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'