- 如果我允许 datetime 为空,为什么会有默认关键字
您将DEFAULT 之后的NULL 误认为允许列包含NULL 值的NULL。阅读下面的区别。
- 是否与日期时间语法有关,所以它应该是默认格式。
CREATE TABLE statement 中的 DEFAULT 关键字不会说明任何格式。当INSERT statement 没有为其提供值时,它指定要用于该列的默认值。
CREATE TABLE 语句中表列的完整定义包含以下部分,按此顺序:
- 字段名称;
- 字段类型;
-
NULL 或 NOT NULL - 是否允许将 NULL 值存储在字段中?如果两者都没有指定,则假定为NULL;
-
DEFAULT 默认值 - 当INSERT 语句没有为其提供值时用于该字段的值; NULL 如果该列可以为空,则可以用作默认值;如果没有指定,MySQL会使用一些规则根据字段类型计算默认值;
-
AUTO_INCREMENT - 当没有为列提供值时,MySQL 使用列中存在的最大值加一;只能用于整数和浮点列;
-
UNIQUE、UNIQUE KEY、KEY、PRIMARY 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 = 6、created_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 = 7、created_at = '2016-06-03 00:00:00'。另请注意,由于为created_at 提供的值中未指定时间组件,MySQL 将它们默认为00:00:00。
一个新的声明:
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 的行(它是由示例开头的第一条语句插入的。