MYSQL列创建中的NULL vs DEFAULT NULL vs NULL DEFAULT NULL有何区别?

40

以下是我公司前任开发人员开发的 MYSQL 数据库中一个创建表语句的 SQL 表定义示例。

DROP TABLE IF EXISTS `classifieds`.`category_vehicles`;
CREATE TABLE `classifieds`.`category_vehicles`(
`adv_id_ref` BIGINT UNSIGNED NOT NULL,
`category_id_ref` TINYINT UNSIGNED NOT NULL,
`forsale_status` TINYINT (1) NOT NULL,
`vehicle_type_id_ref` TINYINT UNSIGNED NOT NULL,
`price` DOUBLE NULL DEFAULT NULL,
 PRIMARY KEY (`adv_id_ref`)
) ENGINE = INNODB CHARSET = latin1 COLLATE = latin1_swedish_ci ;

看一下这个语句中的 price DOUBLE NULL DEFAULT NULL,

通常我使用以下格式:

price DOUBLE NULL;

如果我想要启用该列接受 NULL 值。

那么这 3 条语句有什么不同呢?

  1. price DOUBLE NULL;

  2. price DOUBLE DEFAULT NULL;

  3. price DOUBLE NULL DEFAULT NULL;


你忘记了一种可能性... price DOUBLE DEFAULT NULL NOT NULL 怎么办... 我不是在开玩笑,我实际上有一个定义成这样的数据库 :-) - John Henckel
3个回答

35

没有区别。NULL DEFAULT NULL 是隐式默认值。

根据CREATE TABLE文档:

  • 如果未指定NULL或NOT NULL,该列将被视为已指定NULL。

根据“数据类型默认值”章节:

  • 如果列定义中不包含显式DEFAULT值,则MySQL按如下确定默认值:如果该列可以取NULL值,则该列定义为具有显式DEFAULT NULL子句。

19
在以下三种情况中:
price DOUBLE NULL;

price DOUBLE DEFAULT NULL;

price DOUBLE NULL DEFAULT NULL;

price 是一个浮点数,可以为null,其默认值为null。


“price是一个双精度浮点数,不能为null”这个表达式是错误的。如果省略了“NULL”,则会默认为“NULL”(请参见手册中的引用)。 - user330315
1
@EJP 对我来说,每个语句都是相等的。我仍然无法理解这个。 :) - Prageeth Liyanage
1
@Sylar 它们是相等的。 - user207421

1
price DOUBLE NULL;

允许price列接受NULL
price DOUBLE DEFAULT NULL;

允许 price 列接受 NULL 并将默认值设置为 NULL
price DOUBLE NULL DEFAULT NULL;

执行与第二个语句相同的操作,因为它接受NULL值并设置默认值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接