Неверное значение по умолчанию для поля метки времени create_date - PullRequest
156 голосов
/ 08 февраля 2012

У меня есть следующий оператор создания SQL

mysql> CREATE  TABLE IF NOT EXISTS `erp`.`je_menus` (
    ->   `id` INT(11) NOT NULL AUTO_INCREMENT ,
    ->   `name` VARCHAR(100) NOT NULL ,
    ->   `description` VARCHAR(255) NOT NULL ,
    ->   `live_start_date` DATETIME NULL DEFAULT NULL ,
    ->   `live_end_date` DATETIME NULL DEFAULT NULL , 
    ->   `notes` VARCHAR(255) NULL ,
    ->   `create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
    ->   `created_by` INT(11) NOT NULL ,
    ->   `update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,
    ->   `updated_by` INT(11) NOT NULL , 
    ->   `status` VARCHAR(45) NOT NULL ,
    ->   PRIMARY KEY (`id`) ) 
    -> ENGINE = InnoDB;

дает следующую ошибку

ERROR 1067 (42000): Invalid default value for 'create_date'

В чем здесь ошибка?

Ответы [ 13 ]

151 голосов
/ 08 февраля 2012

Это из-за режима SQL сервера - NO_ZERO_DATE .

Из ссылки: NO_ZERO_DATE - В строгом режиме не допускайте '0000-00-00' в качестве допустимой даты. Вы все еще можете вставить нулевую дату с помощью опции IGNORE . Если не в строгом режиме, дата принимается, но генерируется предупреждение.

115 голосов
/ 08 апреля 2015

Если вы сгенерировали скрипт из рабочей среды MySQL.

Сгенерирована следующая строка

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

Удалите TRADITIONAL из SQL_MODE, и тогда скрипт будет работать нормально

Иначе, вы можете установить SQL_MODE как Разрешить недопустимые даты

SET SQL_MODE='ALLOW_INVALID_DATES';
42 голосов
/ 24 мая 2016

TIMESTAMP имеет диапазон от '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' UTC (см. doc ). Значение по умолчанию должно быть в этом диапазоне.

Другое странное, родственное поведение:

CREATE TABLE tbl1 (
    ts TIMESTAMP);  
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE tbl2 (
    ts TIMESTAMP,
    ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'

CREATE TABLE tbl3 (
    ts TIMESTAMP,
    ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)

Примечание, если вы хотите вставить NULL:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);
33 голосов
/ 14 декабря 2016

В Ubuntu Desktop 16.04 я сделал это:

  1. открыть файл: /etc/mysql/mysql.conf.d/mysqld.cnf в редакторе по вашему выбору.

  2. Ищите: sql_mode, оно будет где-то под [mysqld].

  3. и установите sql_mode на следующее:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Сохраните и перезапустите службу mysql, выполнив:

    sudo service mysql restart

8 голосов
/ 05 июля 2017

Мне удалось решить эту проблему на OS X, установив MySQL из Homebrew

brew install mysql

, добавив следующее в /usr/local/etc/my.cnf

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

и перезапуск MySQL

brew tap homebrew/services
brew services restart mysql
8 голосов
/ 12 января 2017

Используя OS X , установите mysql из Homebrew , Системные переменные, основываясь на его скомпилированных значениях по умолчанию.Решение состоит в том, чтобы удалить «NO_ZERO_DATE» из системных переменных «sql_mode».

Просто имейте в виду, что охват включает.

Если вы хотите повлиять только в своем сеансе, используйте "@@session"Например:

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

В этом случае это не повлияет после завершения сеанса или его изменения.Это не влияет на другой сеанс.

Если вы хотите повлиять на всех клиентов, используйте "@@global", например:

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

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

5 голосов
/ 01 марта 2018

Чтобы избежать этой проблемы, вам необходимо удалить NO_ZERO_DATE из конфигурации режима mysql.

  1. Перейти к phpmyadmin.
  2. После загрузки phpmyadmin нажмитевкладка «переменные».
  3. Поиск в «режиме sql».
  4. Нажмите на параметр «Изменить» и удалите NO_ZERO_DATE (и его запятую) из конфигурации.

Это очень распространенная проблема в локальной среде с wamp или xamp.

5 голосов
/ 19 октября 2017

У меня была похожая проблема с MySQL 5.7 со следующим кодом:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Я исправил, используя вместо этого:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

1 голос
/ 08 апреля 2019

Просто определите следующие строки в верхней части вашего файла базы данных SQL.

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

Это работает для меня.

1 голос
/ 01 ноября 2017

Чтобы отключить режим строгого SQL

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

В файле введите следующие две строки:

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Наконец, перезапустите MySQL с помощью этой команды:

sudo service mysql restart
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...