Недопустимое значение по умолчанию для поля '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'
в чем здесь ошибка?
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, я сделал это:
открыть файл:
/etc/mysql/mysql.conf.d/mysqld.cnfв Редакторе по вашему выбору.ищут:
sql_mode, это будет где-то под[mysqld].и set
sql_modeследующим образом:
NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONсохранить и затем перезапустить службу 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.
- перейти к'phpmyadmin'.
- после загрузки phpmyadmin, нажмите на вкладку "переменные".
- Поиск "режим sql".
- нажмите на опцию Изменить и удалить
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