在下面的mysql命令中,我看到关键字 DEFAULT
CREATE Table User
(
id int(11) NOT NULL AUTO_INCREMENT,
created_at datetime DEFAULT NULL
)
我的问题是:
请向我解释。我还在mysql中找到了DEFAULT的文档页面。但我不理解。
[N.B。:原谅我,如果这是一个初学者问题,或者已经问过了。但我找不到我想要的东西。]
答案 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)
- 如果我允许datetime为null,为什么会有一个默认关键字
醇>
您将NULL
与DEFAULT
后的NULL
误认为允许列包含NULL
值的DEFAULT
。请阅读下面的差异。
- 是否与Datetime语法有关,因此它应采用默认格式。
醇>
CREATE TABLE
statement中的CREATE TABLE
关键字并不能说明任何格式。当INSERT
statement没有为其提供值时,它指定要用于列的默认值。
NULL
语句中表格列的完整定义按以下顺序包含以下部分:
NOT NULL
或NULL
- 是否允许将NULL
值存储在字段中?如果两者均未指定,则假定为DEFAULT
; INSERT
默认值 - NULL
语句未为其提供值时用于字段的值;如果列可以为空,则可以将AUTO_INCREMENT
用作默认值;如果没有指定,MySQL会根据字段类型使用一些规则来计算默认值; UNIQUE
- 当没有为列提供值时,MySQL使用列中存在的最大值加1;只能用于整数和浮点列; UNIQUE KEY
之一,KEY
,PRIMARY KEY
,UNIQUE 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 = NULL
,INSERT INTO User() VALUES()
。
声明
id = 11
看起来很奇怪,但它完全合法,并插入一行使用其所有列的默认值。在这种情况下,新行的值为created_at = NULL
,INSERT 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