Подтвердить что ты не робот

Тип столбца MySQL "TIMESTAMP" неявно включает "NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"

Я только что провел пару часов, отслеживая эту ошибку. Учитывая следующий SQL:

DROP DATABASE IF EXISTS db;
CREATE DATABASE db;
CREATE TABLE db.tbl (t1 TIMESTAMP) ENGINE=INNODB;
SHOW CREATE TABLE db.tbl;

Последняя строка показывает мне:

'CREATE TABLE `tbl` (
  `t1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1'

Откуда берется NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP? Я ничего не писал об этом, и я очень этого не хочу, и я потерял для слов, что MySQL сделает такую ​​презумпцию.

Есть ли у меня какая-то безумная неясная настройка конфигурации, включенная/выключенная? Это поведение по умолчанию? Это ошибка? В любом случае, как заставить MySQL вести себя безопасно?

4b9b3361

Ответ 1

В MySQL 5.6.5 есть несколько обновлений, касающихся этой инициализации, вы можете увидеть по этой ссылке (Свойства автоматической отметки времени до MySQL 5.6.5).

Если вы используете MySQL & lt; = 5.6.5, чтобы игнорировать эту инициализацию, вам нужно установить значение DEFAULT в 0 или NULL с разрешенным NULL.

CREATE TABLE tbl
(
    field1 TIMESTAMP DEFAULT 0,
    field2 TIMESTAMP NULL DEFAULT NULL
)

Если вы используете MySQL> = 5.6.6, есть параметр с именем licit_defaults_for_timestamp, который по умолчанию отключен. Вы можете включить этот параметр или установить значение DEFAULT в 0 или NULL, то же самое для предыдущих версий MySQL.

Если вы используете MySQL> = 8.0.2, то по умолчанию включено по умолчанию enabled. Это отключает нестандартное поведение (к счастью). Кроме того, MySQL генерирует предупреждение при отключении этого параметра. Так, например, если вы не определяете значение DEFAULT для столбца TIMESTAMP, для него автоматически устанавливается значение NULL.

Ответ 2

Thos - значения по умолчанию, которые используются, даже если они явно не указаны в инструкции CREATE. Если вы хотите избежать обоих, используйте t1 TIMESTAMP DEFAULT 0 или ts1 TIMESTAMP NULL DEFAULT NULL

Обновить

До MySQL 5.6.5 вы могли использовать TIMESTAMP только в том случае, если хотите, чтобы столбец автоматически обновлялся при изменении строки. К сожалению, эта функция была ограничена MyISAM и недоступна в таблицах InnoDB.

MySQL 5.6.5 позволяет это с помощью DATETIME. См. Другие сообщения on этот сайт для более подробной информации