如何将字段的默认值设置为'0000-00-00 00:00:00'?

时间:2014-08-17 12:21:01

标签: mysql sql date datetime

如何将字段的默认值设置为'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' 

6 个答案:

答案 0 :(得分:37)

错误原因:SQL模式

如果是sql,您可以将DATEDATETIMETIMESTAMP字段的默认值设置为'0000-00-00'的特殊“零”值作为虚拟日期模式允许它。对于低于5.7.4的MySQL版本,这由NO_ZERO_DATE模式决定,请参阅documentation的摘录:

  

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版本和MySQL服务器的SQL mode
SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

启用INSERT

您可以使用SET sql_mode = '<desired mode>'

为会话设置sql_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所有TIMESTAMPDATETIME列都可以具有神奇的行为(初始化和/或更新),不仅TIMESTAMP而且最多只有一列,请参阅{ {3}}:

  

从MySQL 5.6.5开始,TIMESTAMP和DATETIME列可以自动生成   初始化并更新到当前日期和时间(即,   当前时间戳)。在5.6.5之前,这仅适用于TIMESTAMP,和   每个表最多一个TIMESTAMP列。首先说明如下   描述MySQL 5.6.5及更高版本的自动初始化和更新,   然后是5.6.5之前版本的差异。

您可以在MySQL 5.6.5或更新版本的情况下将您的CREATE TABLE语句更改为:

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.';

答案 1 :(得分:6)

有一个解决方案。 我不确定这个的安全性所以我建议

["Faisalabad Belt",11.428571428571],

第一。将值保存在剪贴板中,然后

SELECT @@SESSION.sql_mode session

之后,您可以使用默认值创建或更改表,例如'0000-00-00 00:00:00'

答案 2 :(得分:2)

SQL Server中的日期只能在1753年1月1日到9999年12月31日之间。

您必须决定如何处理组织或组的默认或缺少日期时间(NULL或其中一个极端值)。通常我们的组织选择没有日期而不是1753或9999日期。当没有日期时,NULL比任何日期更合适,就像1750年代或9999年代的东西看起来一样荒谬。将缺少的日期保留为NULL也可以避免报告虚假日期。

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

答案 3 :(得分:1)

因为MySQL版本5.6.5之后的默认有效日期时间值为

1000-01-01 00:00:00〜9999-12-31 23:59:59

所以我们可以更改mysql配置来解决问题:

  • 显示当前的mysql版本和sql_mode:
select version() as version, @@sql_mode as sql_mode;

将输出: enter image description here

因此,我们需要删除NO_ZERO_IN_DATE和NO_ZERO_DATE。

  • 修改mysql配置文件
vi /etc/mysql/my.cnf

[mysqld]

...

sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

...

  • 保存并重新启动mysql服务器
/etc/init.d/mysql restart

太简单了!

答案 4 :(得分:0)

您也可以替换这样的模式,它有效。

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

答案 5 :(得分:0)

替换代码:

    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