2012-02-08 4 views
102

У меня есть следующие SQL создать заявлениеНедопустимое значение по умолчанию для «create_date» временных меток поля

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'

Что такое ошибка здесь?

+0

Я не вижу ничего плохого с вашим запросом и его работа s на 5.1.50 - сообщество только что протестировано. –

+0

Запрос в порядке и в конце. –

+0

Не уверен, но укажите другое имя в этом поле и попробуйте? –

ответ

111

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

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

+9

Как мне игнорировать вариант? – robert

+6

Вы не можете игнорировать этот параметр. Это опция сервера. Если у вас есть доступ к my.ini (файл конфигурации mysql), удалите NO_ZERO_DATE из режима sql-mode и перезапустите сервер. – Devart

+3

Чтобы проверить эту опцию - запустите SHOW VARIABLES LIKE 'sql_mode' – Devart

82

Если вы сгенерировали скрипт из Workbench MySQL. следующая строка генерируется SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; Удалить ТРАДИЦИОННАЯ из sql_mode, а затем скрипт должен работать нормально

еще, вы можете установить sql_mode, как Разрешить инвалидные Даты SET SQL_MODE='ALLOW_INVALID_DATES';.

+1

Сохранял меня некоторое время, чтобы узнать, почему, черт возьми, он не работает :) – Srneczek

+2

Ahhh спасибо. SET SQL_MODE = 'ALLOW_INVALID_DATES'; была спасателем жизни. У меня была эта проблема, когда я переводил сайт wordpress на другой сервер (оба локальные), и он не позволял мне импортировать данные базы данных из-за этой ошибки, хотя в таблицах с этой ошибкой не было строк. – mikato

+0

fu ****** pro. спасибо :) –

26

TIMESTAMP имеет диапазон '1970-01-01 00:00:01' UTC to '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) 

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

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL); 
16

В 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

Надеется, что это поможет кому-то.

+3

Это помогло, за исключением того, что 'sql_mode' не было для моего экземпляра mySQL на ubuntu16.04. Мне пришлось добавить запись в файл, удалив «NO_ZERO_DATE». Итак, вот как это выглядит сейчас: #Adding ниже линии, чтобы избавиться от no_zero_date 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 – OK999

+0

вы правы .. Я добавил, что раньше, чтобы отключить строгий режим. и когда я редактировал его для этой конкретной проблемы, запись 'sql_mode' была уже там. –

+0

Это ошибка? CURRENT_TIMESTAMP никогда не должен возвращаться «0000-00-00 00:00:00», или я ошибаюсь? Почему мне нужно менять настройки mysqld? – letsjump

7

Использование 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

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

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

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

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

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

# timedatectl set-timezone UTC 

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

0

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

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Я фиксированной с помощью вместо этого:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

1

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

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

  1. Перейти к «PHPMyAdmin»
  2. раз PHPMyAdmin загружается, нажмите на вкладку «переменных»
  3. поиск «SQL режиме»
  4. Нажмите на опцию Edit и удалить NO_ZERO_DATE из конфигурации

Это очень коммун вопрос в местной среде с WAMP или XAMP

Смежные вопросы