将字段留空更好还是用空值填充它更好?

Is leaving a field empty better or filling it with null?

我有一个 table,其中包含一个名为 first_name 的列。用户不强制填写,有时用户将其留空。现在我想知道:将 null 值定义为默认值是否更好?

定义 default null 是多余的。如果您没有定义明确的默认值,则在未提供任何值的情况下,该列将默认为 null。有些人和项目标准喜欢明确说明这些 null 默认值,但它没有实际用途,而且比其他任何东西都更重要。

问题是 Null 好还是不好?

根据我在您提到的场景中的经验,您必须使用默认的空值而不是 null。通过这种方式,您可以节省脚本来检查它是否为空,您可以只检查它是否为空,或者不检查是否为空有点棘手。

不管我的意见如何。

如果表示字段未提供或未知,则使用 NULL 是完全有效的。这真的没有什么区别,这是一个品味问题,但有时知道什么时候没有给出而不是查询空字段或空白字段非常有用。

考虑以下 table:

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     |
+-----+------------+-----------+

所以 - 回答真正的问题:不要在您的 table 创建中定义明确的 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有助于放心查询。

如果您希望列的默认值为 NULL,则写 DEFAULT NULL.

说代码越短越好,这很好,我们可以依靠 "default default" 为我们完成这项工作,但事实上,关于这个问题的每一个现有答案都让你容易潜在的灾难性错误证明了这是多么糟糕的方法!

看看这个:

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。每当您更新 table 中的一行时,时间戳列将重置为 "now"。这吸引了很多人,并且是一个很好的例子,说明为什么做出假设是一种糟糕的做法。

因此,如果您打算学习手册并且您绝对有信心省略 DEFAULT NULL 会产生您想要的语义,那么就继续吧;但我认为 说出你的意思.

真的不会花你什么钱