当前位置: 首页 > 面试题库 >

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

井修雅
2023-03-14
问题内容

如何将字段的默认值设置为“ 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允许您将“ 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”,并且插入会产生警告。

检查版本和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.';


 类似资料:
  • 问题内容: 我需要在数据库上更改一些值。 我忘记为表格设置可空值,并且默认情况下将其设置为0000-00-00 00:00:00。 现在,我需要将该值转换为。 字段类型为“日期时间”。 我该怎么做? 我尝试使用典型的方法,但是它不起作用。 问题答案: 您首先需要将该列设置为可空: 然后更新值:

  • 我有一个包含日期的数据库表 有没有什么方法可以在不改变表结构的情况下获得?

  • 问题内容: 字段定义 二传手 有谁知道如何将“零日期”转换为适当的值?因为我有错误: 即使我像这样设置“默认”字段和设置器: 我仍然会有同样的问题。 问题答案: 在这里,我将大胆猜测您正在使用MySQL :-)它使用“零日期”作为特殊占位符 -不幸的是,JDBC默认情况下无法处理它们。 解决方案是将“ zeroDateTimeBehavior = convertToNull”指定为MySQL连接的

  • 问题内容: 字段定义 二传手 有谁知道如何将“零日期”转换为适当的值?因为我有错误: 即使我像这样设置“默认”字段和设置器: 我仍然会有同样的问题。 问题答案: 在这里,我将做出一个疯狂的猜测,即您正在使用MySQL :-)它使用“零日期”作为特殊的占位符 -不幸的是,默认情况下JDBC无法处理它们。 解决方案是将“ zeroDateTimeBehavior = convertToNull”指定为

  • 问题内容: 我正在做一个需要从数据库中提取数据的项目,我使用Spring MVC从数据库中构建模型以选择数据。 这是我的 JSP页面 的问题 : 如您所见,我尝试从标记库中使用。 问题: 但是当使用此 控制器 准备我的模型时 : 它给我这样的错误: 路径为[/ controller]的servlet [appServlet]的service()抛出异常[请求处理失败;嵌套的异常是org.hiber

  • 问题内容: 这是一个测试代码: 提供: 但这不是一个有效的日期。我不了解返回的值,尤其是月份……您能解释一下吗? 问题答案: 您在这里看到两种效果。第一个是您使用一种可以以多种形式书写的日期书写方式: 因此,根据日期本身,您已经指定了11月30日-1。 现在剩下的时间偏移大约为9分21秒。这是因为与1911年3月10日当地时间发生的巴黎/法国UTC相比,时钟发生了变化。 我稍微修改了您的代码示例,