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

lau*_*kok 17 mysql sql datetime date

如何将字段的默认值设置为'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.';
Run Code Online (Sandbox Code Playgroud)

运行此查询时出现此错误,

#1067 - Invalid default value for 'date_from' 
Run Code Online (Sandbox Code Playgroud)

VMa*_*Mai 39

错误原因:SQL模式

您可以设置的默认值DATE,DATETIME或者TIMESTAMP如果SQL模式允许其领域的"0000-00-00"特殊的"零"值作为虚拟日期.对于低于5.7.4的MySQL版本,这由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版本和MySQL服务器的SQL模式

SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Run Code Online (Sandbox Code Playgroud)

启用INSERT

您可以为您的会话设置sql_mode SET sql_mode = '<desired mode>'

SET sql_mode = 'STRICT_TRANS_TABLES';   
Run Code Online (Sandbox Code Playgroud)

DATETIME的有效范围

支持的范围DATETIME

[1000-01-01 00:00:00] to ['9999-12-31 23:59:59'], 
Run Code Online (Sandbox Code Playgroud)

所以最小有效DATETIME值是'1000-01-01 00:00:00'.
我不建议使用此值.

附加说明

由于MySQL 5.6.5所有TIMESTAMPDATETIME列都可以具有神奇的行为(初始化和/或更新),不仅TIMESTAMP最多只有一列,请参阅TIMESTAMP和DATETIME的自动初始化和更新:

从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.';
Run Code Online (Sandbox Code Playgroud)


reb*_*vid 6

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

SELECT @@SESSION.sql_mode session
Run Code Online (Sandbox Code Playgroud)

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

SET SESSION sql_mode = '';
Run Code Online (Sandbox Code Playgroud)

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