什么是" DEFAULT"在Mysql Datetime中?

时间:2016-06-11 04:40:33

标签: mysql

在下面的mysql命令中,我看到关键字 DEFAULT

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

我的问题是:

  1. 如果我允许datetime为null,为什么会有一个默认关键字
  2. 是否与Datetime语法有关,因此它应采用默认格式。
  3. 请向我解释。我还在mysql中找到了DEFAULT的文档页面。但我不理解。

    [N.B。:原谅我,如果这是一个初学者问题,或者已经问过了。但我找不到我想要的东西。]

5 个答案:

答案 0 :(得分:3)

<强> 1。如果我允许datetime为null,为什么会有默认关键字

  

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

如果您不手动设置,MySQL会根据自己的规则为列定义添加默认值。因此,除了特殊数据类型

外,始终显示DEFAULT
  

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

<强> 2。它是关于Datetime语法的,因此它应该是默认格式。

没有。如果允许null,则column可以采用任何有效的datetime值OR 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
);

你说,你&#34;允许null&#34;对于这个专栏。可能是您使用created_at datetime NULL语法的第一个查询。但由于上述规则,MySQL确实将其转换为第二个查询。

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:2)

  
      
  1. 如果我允许datetime为null,为什么会有一个默认关键字
  2.   

您将NULLDEFAULT后的NULL误认为允许列包含NULL值的DEFAULT。请阅读下面的差异。

  
      
  1. 是否与Datetime语法有关,因此它应采用默认格式。
  2.   

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

NULL语句中表格列的完整定义按以下顺序包含以下部分:

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

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

您的陈述:

id

NOT NULL指定DEFAULT,跳过AUTO_INCREMENT并指定AUTO_INCREMENT。如果没有0,MySQL会使用AUTO_INCREMENT作为默认值(这是整数类型的默认值)。由于INSERT,当1语句中未提供值时,MySQL会找到已存储在列中的最大值,使用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 = 6

使用created_at = '2016-06-02 12:34:56'id插入新行。由于未为列AUTO_INCREMENT提供值,6选项为其生成NULL(列中已存在较大值的后续值)。

AUTO_INCREMENT列提供INSERT INTO User(id, created_at) VALUES (NULL, '2016-06-03') 时也是如此:

id = 7

插入created_at = '2016-06-03 00:00:00'created_at。另请注意,由于未在00:00:00提供的值中指定时间组件,因此MySQL会将它们默认为INSERT INTO User(id) VALUES (10)

新声明:

id = 10

创建一行created_at = NULLINSERT INTO User() VALUES()

声明

id = 11

看起来很奇怪,但它完全合法,并插入一行使用其所有列的默认值。在这种情况下,新行的值为created_at = NULLINSERT INTO User(id) VALUES(5)

最后,声明

id = 5

失败,因为表中已经存在一行{{1}}(它是由示例开头的第一个语句插入的。

答案 3 :(得分:1)

NULL视为 unknown 。这有一些有趣的含义,例如:

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

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

答案 4 :(得分:0)

来自MySQL Data Type Default Values

  

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

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

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