我有一个包含名为first_name
的列的表。用户填写它并不是强制性的,有时用户将其留空。现在我想知道:将null
值定义为默认值是否更好?
答案 0 :(得分:4)
考虑下表:
create table test1 (
id int not null,
first_name varchar(50), -- nullable
last_name varchar(50) -- also nullable
);
如果您的UI中未提供first_name,您可以选择不通过执行以下操作将数据插入该字段:
insert into test1 (id, last_name) values (123, 'Smith');
或者,您可以选择为first_name显式提供NULL,如下所示:
insert into test1 (id, first_name, last_name) values (123, NULL, 'Smith');
-- you could also do like this below:
-- insert into test1 values (123, NULL, 'Smith');
-- I just like providing explicit fieldnames and values
无论您选择哪种方式,只需在整个应用程序中保持一致。您的结果看起来一样:
+-----+------------+-----------+
| id | first_name | last_name |
+-----+------------+-----------+
| 123 | NULL | Smith |
| 123 | NULL | Smith |
+-----+------------+-----------+
所以 - 回答真正的问题:不要在表创建中定义显式的null。
供应''或NULL,只是确保你是一致的。如果某些first_name是''有些是NULL,你的select语句必须是:
select * from test1 where first_name is NULL or first_name is '';
这带来了另一点 - 如果用户键入了' ' (4个空格)?您必须确保first_name符合某些条件,并且first_name的修剪版本在进入数据库之前会经过验证。如果您的数据库最终以'',' ',' '等你必须不断运行:
select * from test1 where first_name is NULL or trim(first_name) = '';
--or--
--select * from test1 where first_name is NULL or length(trim(first_name)) = 0;
与NULL first_name的一致性将有助于自信地查询。
答案 1 :(得分:3)
如果您希望列的默认值为NULL
,请填写DEFAULT NULL
。
一切都很好,并且很好说更短的代码更好,我们可以依靠“默认默认”来为我们完成这项工作,但事实上,这个问题的每一个现有答案都会让你容易出现潜在的灾难性错误证明了真正的可怕方法!
看看这个:
CREATE TABLE `test` (`ts` TIMESTAMP);
SHOW CREATE TABLE `test`;
-- Result:
CREATE TABLE `test` (
`ts` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8
哇!什么是DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
?那是what you get with a TIMESTAMP
field with NOT NULL
set and no explicit default。每当更新该表中的行时,timestamp列将重置为“now”。这会吸引很多人,并且是一个很好的例子,说明为什么做出假设是一种可怕的做法。
因此,如果您要学习本手册,并且您绝对相信省略DEFAULT NULL
将导致您想要的语义,那么请继续前进;但我认为只要说出你的意思就没有任何成本。
答案 2 :(得分:1)
定义default null
是多余的。如果未定义显式默认值,则如果未提供任何值,则列将默认为null
。有些人和项目标准就像明确说明这些null
默认值一样,但它没有任何实际意义,而且比其他任何事情都更具品味。
答案 3 :(得分:1)
问题是否更好?
根据我在您提到的场景中的经验,您必须设置默认空值而不是null。通过这种方式,您可以保存脚本以检查其是否为空,您可以将其检查为空或者检查为null是否有点棘手。
我的意见如何。
答案 4 :(得分:1)
使用NULL
完全有效,如果它意味着没有给出或未知的字段。它确实没有区别,这是一个品味问题,但有时候知道什么时候没有给出东西而不是查询空的或空白的字段是非常有用的。