Недійсне значення за замовчуванням для поля часової позначки 'create_date'


186

У мене є наступний оператор створення 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'

У чому тут помилка?


Я не бачу нічого поганого у вашому запиті, і він працює на тестуванні спільноти 5.1.50.
Jaspreet Chahal

Запит також добре в моєму кінці.
Шакти Сінгх

Не впевнений, але дайте інше ім’я цьому полі та спробуйте?
Naveen Kumar

Я використовую спільноту mysql 5.1.56 в ubuntu 10.04. і не працює
Роберт

5
Дата без нуля вимагає дати. Використовуйте '1970-01-01 00:00:01'. [взято звідси] [1] [1]: dba.stackexchange.com/questions/6171/…
Jadeye

Відповіді:


176

Це через режим SQL сервера - NO_ZERO_DATE .

З довідки: NO_ZERO_DATE- У суворому режимі не допускайте '0000-00-00'дійсну дату. Ви все ще можете вставити нульові дати за допомогою параметра IGNORE . Якщо не в суворому режимі, дата приймається, але створюється попередження.


19
як мені дати варіант ігнорування?
Роберт

9
Ви не можете ігнорувати цю опцію. Це варіант сервера. Якщо у вас є доступ до my.ini (файл конфігурації mysql), видаліть NO_ZERO_DATE з опції режиму sql та перезапустіть сервер.
Деварт

7
Щоб перевірити цю опцію - запустіть ПОКАЗУВАТИ ВАРІАБЛІСЬКІ ПОДІБНІ "sql_mode"
Devart

6
Я створив скрипт за допомогою mysql workbench. У сценарії sql_mode встановлений як традиційний. Якщо я видаляю традиційне, сценарій працює.
Роберт

17
У налаштуваннях MySQL Workbench перейдіть на вкладку «Модель: MySQL». Там встановлено "SQL_MODE для використання у створених сценаріях" на "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION", що вирішує проблему назавжди.
sgtdck

140

Якщо ви створили скрипт на робочому столі MySQL.

Створюється наступний рядок

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

Видаліть TRADITIONAL з SQL_MODE, і тоді сценарій повинен працювати нормально

В іншому випадку, ви можете встановити SQL_MODE як Дозволити недійсні дати

SET SQL_MODE='ALLOW_INVALID_DATES';

1
Врятував мене деякий час у пошуках, чому, до біса, це не працює :)
Srneczek,

5
Ах, дякую. SET SQL_MODE = 'ALLOW_INVALID_DATES'; був рятувальником життя. У мене виникла ця проблема, коли я триє переміщувати сайт wordpress на інший сервер (обидва локальні), і це не дозволило мені імпортувати дані бази даних через цю помилку, хоча в таблицях із цією помилкою не було рядків.
mikato

Працював як шарм! Дякую.
moreirapontocom

52

TIMESTAMP має діапазон від '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07 UTC (див. Док. ). Значення за замовчуванням повинно бути в межах цього діапазону.

Інші дивні, пов'язані, поведінки:

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);

1
Це відбувається зі мною. Що відбувається? ts2 навіть не "НЕ НУЛЬНИЙ" ...!
PedroD

2
Це може бути тому, що "Якщо ви не встановите значення для першого стовпця TIMESTAMP у таблиці, MariaDB автоматично призначить йому поточну дату та час під час виконання запиту UPDATE або INSERT для відповідних рядків." - MariaDB Docs
jsphpl

1
Мені подобається використання column_name TIMESTAMP DEFAULT NOW(). Можливо, не підходить для кожної ситуації, але я подумав, що поділюсь, оскільки я теж мав справу з цим.
DeezCashews

1
назва_колонки TIMESTAMP DEFAULT '1970-01-01 00:00:01' зробила для мене трюк. Дякую!
метафа

42

На робочому столі ubuntu 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
Це допомогло, за винятком того, що 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

Ви маєте рацію .. Я додав, що раніше, щоб відключити суворий режим .. і коли я редагував його для цієї конкретної проблеми, sql_modeзапис уже був.
Мубашар Аббас

Це помилка? CURRENT_TIMESTAMP ніколи не повертається "0000-00-00 00:00:00", або я помиляюся? Чому я повинен змінити параметри mysqld?
letsjump

@letsjump, тому що хтось налаштував ваш сервер mysql неправильно. Я зачіпаю цю проблему із імпортованою базою даних. значення за замовчуванням для часової позначки в стовпці не є дійсним значенням часової мітки. Виправлення REAL полягає в тому, щоб оновити часову позначку за замовчуванням на щось дійсне, як-от 1970 - найдавнішу доступну дату. Тимчасове рішення полягає у відключенні перевірки в базі даних.
anon58192932

9

Використовуючи 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".

У цьому випадку він впливає лише на клієнтів, які підключаються після зміни (не впливають на поточних всіх клієнтів) і не спрацьовують після виходу з сервера.


8

Мені вдалося вирішити цю проблему на 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

7

У мене була схожа проблема з MySQL 5.7 із таким кодом:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Я виправив, використовуючи це замість цього:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
Я думаю, що це насправді найкращий варіант, коли це має сенс за замовчуванням до поточного, однак це не має сенсу для часової позначки народження - лише як приклад.
мяв

7

Щоб уникнути цієї проблеми, вам потрібно видалити NO_ZERO_DATEз конфігурації режиму mysql.

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

Це дуже поширена проблема в місцевому середовищі з wamp або xamp.


6

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

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

Це працює для мене.


2

Відключення суворого режиму 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

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

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


1

Значення за замовчуванням повинні починатися з 1000 року.

Наприклад,

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

Сподіваюся, що це комусь допоможе.


1

Змініть це:

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

До наступного:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

1
З перегляду: Привіт, будь ласка, не відповідайте лише вихідним кодом. Спробуйте надати приємний опис про те, як працює ваше рішення. Дивіться: Як написати гарну відповідь? . Дякую
sɐunıɔ ןɐ qɐp

Якщо це сайт WordPress, будь ласка, не оновлюйте основні таблиці WordPress. Багато плагінів очікують значення нульових значень, тому WordPress не може змінити це значення за замовчуванням із застарілих причин, які б порушили плагіни. Wordpress нитка та підтримка Wordpress . Зміна структури бази даних без ознайомлення з кодом, покладаючись на значення за замовчуванням, може призвести до неприємних помилок. Хоча це може спрацювати як рішення у багатьох випадках, це може призвести до руйнування інших. Не універсальне рішення.
SherylHohman

0

Ви можете просто змінити це:

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

Щось подібне:

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

0

Ви можете просто змінити це:

create_date дата НЕ ПОВЕРНЕНО ЗАВДАННЯ '0000-00-00 00:00:00',

Щось подібне:

create_date варчар (80) НЕ ВІДПОВІДНИЙ "0000-00-00 00:00:00",

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.