如何将字段的默认值设置为“ 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'
错误原因:SQL模式
您可以设置的默认值DATE,DATETIME或TIMESTAMP场特殊的“零”作为虚拟日期“0000-00-00”值,如果SQL模式允许它。对于低于5.7.4的MySQL版本,这是由NO_ZERO_DATE模式决定的,请参见文档的以下摘录:
DATE
DATETIME
TIMESTAMP
MySQL允许您将“ ero”值“ 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”,并且插入会产生警告。
严格模式会影响服务器是否允许将“ 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
启用插入
您可以使用以下命令为您的会话设置sql_mode SET sql_mode = '<desired 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之前的版本的区别。
对于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.';