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

错误原因:SQL模式

您可以设置的默认值DATEDATETIMETIMESTAMP场特殊的“零”作为虚拟日期“0000-00-00”值,如果SQL模式允许它。对于低于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”,并且插入不会产生任何警告。

如果启用了严格模式,则除非也给出IGNORE,否则不允许使用“ 0000-00-00”,并且插入会产生错误。对于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 = '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并且最多只有一个列,请参阅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.';

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何解析0000-00-00 00:00:00?

无法将DateTimeField的默认值设置为“ 0000-00-00 00:00:00”

如何将时间“0000-00-00 00:00:00”设置为LocalDateTime?

0000-00-00 00:00:00在时间戳

当DateTime设置为0000-00-00 00:00:00时,MySQL选择MIN DateTime

将 PHP DateTimeInterface 保存到 MySQL 结果为 0000-00-00 00:00:00

MySQL导入将时间戳的空值转换为0000-00-00 00:00:00

如何在PHP中正确设置“ 0000-00-00 00:00:00”作为DateTime

如何使用javascript获取当前时间为00/00/0000 00:00:00

具有“ 0000-00-00 00:00:00”格式的Doctrine2默认时间戳?

PostgreSQL中更换 “0000-00-00 00:00:00” 为NULL

'0000-00-00 00:00:00'不能表示为java.sql.Timestamp错误

为什么 SQL 会将表中的日期更新为 0000-00-00 00:00:00?

MySQL不正确的日期时间值:“ 0000-00-00 00:00:00”

不正确的DateTime值'0000-00-00 00:00:00'-Date_Sub()在

日期时间值不正确:列的“0000-00-00 00:00:00”

无法将'0000-00-00 00:00:00'转换为TIMESTAMP

如何在Python中初始化datetime 0000-00-00 00:00:00?

如何在python中使用strftime()格式化'0000-00-00 00:00:00'?

如何将具有0000-00-00 00:00:00值的日期时间设置为NULL?

为什么将“ 0000:00:00 00:00:00”解析为日期返回-0001-11-28T00:00:00Z?

将时间设置为00:00:00

如何将日期修整为00/00/0000的格式?

20.04 崩溃,错误为 \00\00\00

util.JDBCExceptionReporter值'0000-00-00 00:00:00'不能表示为java.sql.Timestamp

Mysql:将0000-00-00设置为null

MySQL - 如何选择日期时间字段不等于 0000-00-00 00:00:00 的行?

获取异常,例如“无法将值'0000-00-00 00:00:00'从第12列转换为TIMESTAMP”

如何在格式为'0000-00-00T00:00:00 + 00:00'的字符串上使用datetime.strptime?