Недопустимое значение по умолчанию для поля 'create date' timestamp



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



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'



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

652   12  

12 ответов:

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

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

Если вы создали скрипт из MySQL workbench.

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

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

удалите традиционный из SQL_MODE, и тогда скрипт должен работать нормально

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

SET SQL_MODE='ALLOW_INVALID_DATES';

метка времени имеет диапазон от '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' мирового (см. 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)

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

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

в ubuntu desktop 16.04, я сделал это:

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

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

  3. и set sql_mode следующим образом:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

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

    sudo service mysql restart

используя OS X, установите mysql из доморощенного системные переменные, основанные на компиляции по умолчанию. Решение заключается в удалении " 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".

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

я смог решить эту проблему на 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

у меня была аналогичная проблема с MySQL 5.7 следующий код:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

я исправил с помощью этого:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

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

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

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

вы можете изучить настройку часового пояса на экземпляре MySql:

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

в моем случае я понял, что в базовой системе был установлен часовой пояс BST, а не UTC, и поэтому в таблице create значение по умолчанию '1970-01-01 00:00:01' было принудительно возвращено на 1 час, что привело к недопустимому значению метки времени.

для меня я действительно хотел, чтобы часовой пояс машины был установлен в UTC, и это меня разобрало. Поскольку я запускал Centos / 7, я просто сделал

# timedatectl set-timezone UTC

и перезапустить все.

чтобы отключить строгий режим 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

вы можете просто изменить это:

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

что-то вроде этого:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',

значения по умолчанию должны начинаться с 1000 года.

например,

ALTER TABLE MYTABLE last_active DATETIME DEFAULT '1000-01-01 00:00:00'

надеюсь, это кому-то поможет.

Comments

    Ничего не найдено.