【问题标题】:What is the Meaning of "DEFAULT" in Mysql Datetime?Mysql Datetime中“DEFAULT”的含义是什么?
【发布时间】:2016-10-12 02:46:43
【问题描述】:

在以下 mysql 命令中,我看到了关键字 DEFAULT

CREATE Table User
(
    id int(11) NOT NULL AUTO_INCREMENT,
    created_at datetime DEFAULT NULL
)

我的问题是:

  1. 如果我允许 datetime 为空,为什么会有默认关键字
  2. 是关于日期时间语法的,所以它应该是默认格式。

请给我解释一下。我还在 mysql 中找到了 DEFAULT 的文档页面。但我不明白。

[注:请原谅我,如果这是一个初学者问题,或者已经问过。但我没有找到我要找的东西。]

【问题讨论】:

    标签: mysql


    【解决方案1】:

    1.如果我允许 datetime 为空,为什么会有默认关键字

    如果列定义不包含明确的 DEFAULT 值,MySQL 将按照Section 12.7, “Data Type Default Values” 中的描述确定默认值。

    如果您不手动设置,MySQL 将按照自己的规则将默认值添加到列定义中。所以,DEFAULT 总是出现,除了特殊的数据类型

    DEFAULT 不适用于 BLOB、TEXT、GEOMETRY 和 JSON 类型

    2。是关于日期时间语法的,所以它应该是默认格式。

    没有。如果您允许 null,则 column 可以采用任何有效的日期时间值或 null。 Null 也有效。还有from manual

    如果列可以将 NULL 作为值,则使用显式 DEFAULT NULL 子句定义该列。

    因此,如果您创建包含列created_at datetime 的表,它将根据这些规则转换为created_at datetime DEFAULT NULL

    更新

    一些例子。接下来的CREATE TABLE 语句是等价的:

    CREATE Table User
    (
        created_at datetime NULL
    );
    
    CREATE Table User
    (
        created_at datetime DEFAULT NULL
    );
    

    您说过,您对此列“允许 null”。可能,您使用的是带有created_at datetime NULL 语法的第一个查询。但是由于上面的规则,MySQL 确实将其转换为第二个查询。

    【讨论】:

    • 你能举个例子吗?请
    【解决方案2】:
    1. 如果我允许 datetime 为空,为什么会有默认关键字

    您将DEFAULT 之后的NULL 误认为允许列包含NULL 值的NULL。阅读下面的区别。

    1. 是否与日期时间语法有关,所以它应该是默认格式。

    CREATE TABLE statement 中的 DEFAULT 关键字不会说明任何格式。当INSERT statement 没有为其提供值时,它指定要用于该列的默认值。

    CREATE TABLE 语句中表列的完整定义包含以下部分,按此顺序:

    • 字段名称;
    • 字段类型;
    • NULLNOT NULL - 是否允许将 NULL 值存储在字段中?如果两者都没有指定,则假定为NULL
    • DEFAULT 默认值 - 当INSERT 语句没有为其提供值时用于该字段的值; NULL 如果该列可以为空,则可以用作默认值;如果没有指定,MySQL会使用一些规则根据字段类型计算默认值;
    • AUTO_INCREMENT - 当没有为列提供值时,MySQL 使用列中存在的最大值加一;只能用于整数和浮点列;
    • UNIQUEUNIQUE KEYKEYPRIMARY KEY 之一 - 前两个是等效的,它们指定该列是表的唯一索引(它不能包含两个或多个相同的值行);最后两个指定列是行的标识符(它是UNIQUE INDEX,不能包含NULL 值);可以在此处指定这些属性以与其他数据库系统兼容;在 MySQL 上,通常使用不同的语法在列之后指定表索引;
    • COMMENT string - 列的注释; MySQL 不使用它,但它对开发人员很有用(指定代表列的内容);
    • 其他较少使用的选项。

    只需要上面列表中的前两项(名称和类型);所有其他都是可选的。如果存在,则必须按列表顺序提供。

    您的陈述:

    CREATE TABLE User
    (
        id INT(11) NOT NULL AUTO_INCREMENT,
        created_at DATETIME DEFAULT NULL
    )
    

    id 列指定NOT NULL,跳过DEFAULT 并指定AUTO_INCREMENT。如果没有AUTO_INCREMENT,MySQL 使用0 作为默认值(这是整数类型的默认值)。由于AUTO_INCREMENT,当INSERT 语句中没有提供值时,MySQL 会找到已存储在列中的最大值,将其与1 一起增加并将此计算值用于列。

    created_at 列未指定它是否允许 NULL 值(它允许它们,这是默认值),并指定该列的默认值为 NULL

    示例

    让我们看看它是如何工作的:

    INSERT INTO User(id, created_at) VALUES (5, '2016-06-01 11:22:33')
    

    插入具有INSERT 语句中提供的值的新行;这一点也不奇怪。

    INSERT INTO User(created_at) VALUES ('2016-06-02 12:34:56')
    

    使用id = 6created_at = '2016-06-02 12:34:56' 插入新行。因为没有为列id 提供值,所以AUTO_INCREMENT 选项为其生成了6(列中已存在较大值的后继值)。

    AUTO_INCREMENT 列提供NULL 时也会发生同样的情况:

    INSERT INTO User(id, created_at) VALUES (NULL, '2016-06-03')
    

    插入id = 7created_at = '2016-06-03 00:00:00'。另请注意,由于为created_at 提供的值中未指定时间组件,MySQL 将它们默认为00:00:00

    一个新的声明:

    INSERT INTO User(id) VALUES (10)
    

    创建具有id = 10created_at = NULL 的行。

    声明

    INSERT INTO User() VALUES()
    

    看起来很奇怪,但它是完全合法的,它会插入一个对其所有列使用默认值的行。在这种情况下,新行的值是 id = 11created_at = NULL

    最后是声明

    INSERT INTO User(id) VALUES(5)
    

    失败,因为表中已经存在具有id = 5 的行(它是由示例开头的第一条语句插入的。

    【讨论】:

      【解决方案3】:

      DEFAULT 约束用于在列中插入默认值。

      如果没有指定其他值,default 值将添加到所有新记录中。

      数据类型规范中的DEFAULT value 子句表示列的默认值。除了一个例外,默认值必须是一个常量;它不能是函数或表达式。

      有关更多信息,请参阅此问题。 MySQL columns with default null - stylistic choice, or is it?

      【讨论】:

      • 那为什么这里指定了NULL呢?
      • 明确定义null为默认值。如果没有默认值,未能在新行中手动指定该列的值将导致警告或错误。
      【解决方案4】:

      NULL 视为未知。这具有有趣的含义,例如:

      mysql> select null = true;
      +-------------+
      | null = true |
      +-------------+
      |        NULL |
      +-------------+
      

      mysql> select null != true;
      +--------------+
      | null != true |
      +--------------+
      |         NULL |
      +--------------+
      

      【讨论】:

        【解决方案5】:

        来自MySQL Data Type Default Values

        如果列可以将 NULL 作为值,则使用显式 DEFAULT NULL 子句定义该列。

        对于 MySQL,这些定义都是相同的

        column type
        column type NULL
        column type DEFAULT NULL
        column type NULL DEFAULT NULL
        

        【讨论】:

          猜你喜欢
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多