Подтвердить что ты не робот

Как установить значение по умолчанию для поля как "0000-00-00 00:00:00"?

Как установить значение по умолчанию для поля как "0000-00-00 00:00:00"? Если мы не можем использовать "0000-00-00 00:00:00" по умолчанию? Что такое базовый действительный tiemdate?

Например, это SQL для создания моей таблицы статей,

-- -----------------------------------------------------
-- Table `article`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `article` ;

CREATE TABLE IF NOT EXISTS `article` (
  `article_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `url` VARCHAR(255) NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  `date_from` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured from a datetime.',
  `date_to` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured to a datetime.',
  `backdated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The manual datetime that is modified or input by the user.',
  `created_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The permanent datetime when the article is created.',
  `updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'The datetime when the article is updated on.',
  PRIMARY KEY (`article_id`, `parent_id`, `template_id`),
  UNIQUE INDEX `url_UNIQUE` (`url` ASC))
ENGINE = MyISAM
AUTO_INCREMENT = 66
COMMENT = 'Entity that holds the article with one-to-one properties.';

Я получаю эту ошибку при запуске этого запроса,

#1067 - Invalid default value for 'date_from' 
4b9b3361

Ответ 1

Причина ошибки: режим SQL

Вы можете установить значение по умолчанию для поля DATE, DATETIME или TIMESTAMP специальным "нулевым" значением "0000-00-00" в качестве фиктивной даты, если это разрешит режим sql. Для версий MySQL ниже 5.7.4 это управляется режимом NO_ZERO_DATE, см. Эту выдержку документации:

MySQL позволяет вам хранить "нулевое" значение "0000-00-00" в качестве "фиктивная дата". Это в некоторых случаях более удобно, чем использование NULL значений и использует меньше пространства данных и индексов. Чтобы запретить "0000-00-00" , включить режим NO_ZERO_DATE SQL.

Кроме того, должен быть включен строгий режим для запрета "нулевых" значений:

Если этот режим и строгий режим включены, "0000-00-00" не разрешено и вставки создают ошибку, если IGNORE также не указан.

По MySQL 5.7.4 это зависит только от строгого режима:

Строгий режим влияет на то, разрешает ли серверу "0000-00-00" как действительная дата:

Если строгий режим не включен, допускается "0000-00-00" и вставляет не выдавать никаких предупреждений.

Если строгий режим включен, "0000-00-00" не разрешен и вставляет выдает ошибку, если IGNORE не указан. Для INSERT IGNORE и UPDATE IGNORE, "0000-00-00" разрешено, и вставки создают предупреждение.

Проверить версию и режим SQL

Итак, вы должны проверить свою версию MySQL и SQL-режим вашего сервера MySQL с помощью

SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

Включить INSERT

Вы можете установить sql_mode для своего сеанса с помощью SET sql_mode = '<desired mode>'

SET sql_mode = 'STRICT_TRANS_TABLES';   

Допустимый диапазон для DATETIME

Поддерживаемый диапазон для DATETIME -

[1000-01-01 00:00:00] to ['9999-12-31 23:59:59'], 

поэтому минимальное значение DATETIME равно "1000-01-01 00:00:00".
Я бы не рекомендовал использовать это значение.

Дополнительная заметка

Так как MySQL 5.6.5 все столбцы TIMESTAMP и DATETIME могут иметь магическое поведение (инициализация и/или обновление), а не только TIMESTAMP и только один столбец больше, см. Автоматическая инициализация и обновление для TIMESTAMP и DATETIME:

Начиная с MySQL 5.6.5, столбцы TIMESTAMP и DATETIME могут быть автоматически инициализируется и обновляется до текущей даты и времени (то есть текущая временная метка). До 5.6.5 это верно только для TIMESTAMP, и для не более одного столбца TIMESTAMP за таблицу. Следующие примечания сначала описать автоматическую инициализацию и обновление для MySQL 5.6.5 и выше, то различия для версий, предшествующих 5.6.5.

Вы можете изменить оператор CREATE TABLE в случае MySQL 5.6.5 или новее:

CREATE TABLE IF NOT EXISTS `article` (
  `article_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `url` VARCHAR(255) NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  `date_from` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured from a datetime.',
  `date_to` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured to a datetime.',
  `backdated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The manual datetime that is modified or input by the user.',
  `created_on` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'The permanent datetime when the article is created.',
  `updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'The datetime when the article is updated on.',
  PRIMARY KEY (`article_id`, `parent_id`, `template_id`),
  UNIQUE INDEX `url_UNIQUE` (`url` ASC))
ENGINE = MyISAM
AUTO_INCREMENT = 66
COMMENT = 'Entity that holds the article with one-to-one properties.';

Ответ 2

Существует решение. Я не уверен в безопасности, поэтому рекомендую

SELECT @@SESSION.sql_mode session

первый. Сохраните значение в вашем буфере обмена, затем

SET SESSION sql_mode = '';

После этого вы можете создать или изменить таблицу со значениями по умолчанию, например "0000-00-00 00:00:00"

Ответ 3

Даты в SQL Server могут быть только между 1 января 1753 года и 31 декабря 9999 года.

Вам нужно решить, как обращаться с дефолтными или отсутствующими датами в качестве организации или группы (NULL или одна из этих крайностей). Обычно наша организация предпочитает идти без даты, а не с даты 1753 или 9999. Когда нет даты, NULL более подходит, чем любая дата вообще, как нелепо, как может показаться что-то в 1750 или 9999 годах. Оставляя отсутствующие даты, поскольку NULL также избегает отчетов, выводящих фиктивные даты.

http://msdn.microsoft.com/en-us/library/ms187819.aspx

Ответ 4

Вы также можете заменить такие режимы, как это, он работает.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'NO_AUTO_CREATE_USER',''));

Ответ 5

Заменить код:

    CREATE TABLE IF NOT EXISTS `article` (
      `article_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `url` VARCHAR(255) NOT NULL,
      `title` VARCHAR(255) NOT NULL,
      `date_from` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured from a datetime.',
      `date_to` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Set the article as new or featured to a datetime.',
      `backdated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The manual datetime that is modified or input by the user.',
      `created_on` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'The permanent datetime when the article is created.',
      `updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'The datetime when the article is updated on.',
      PRIMARY KEY (`article_id`, `parent_id`, `template_id`),
      UNIQUE INDEX `url_UNIQUE` (`url` ASC))
    ENGINE = MyISAM
    AUTO_INCREMENT = 66
    COMMENT = 'Entity that holds the article with one-to-one properties.';

к

    CREATE TABLE IF NOT EXISTS `article` (
      `article_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `url` VARCHAR(255) NOT NULL,
      `title` VARCHAR(255) NOT NULL,
      `date_from` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT 'Set the article as new or featured from a datetime.',
      `date_to` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT 'Set the article as new or featured to a datetime.',
      `backdated_on` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT 'The manual datetime that is modified or input by the user.',
      `created_on` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'The permanent datetime when the article is created.',
      `updated_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'The datetime when the article is updated on.',
      PRIMARY KEY (`article_id`, `parent_id`, `template_id`),
      UNIQUE INDEX `url_UNIQUE` (`url` ASC))
    ENGINE = MyISAM

Он работает для меня, и это будет полезно для php 7 и mysql 5.7