mysql 或其他数据库中的 "null" 值有什么问题?

what is the problem of "null" values in mysql or other dbs?

据我所知,null在InnoDB中是可以索引的。但是许多同事说空值是糟糕的数据库设计。所以我不知道 "null" 的问题是什么,是第三个值(eq,不是 eq,未知)问题还是其他阻止人们使用可空列的问题?

NULL 是 SQL 的重要组成部分。它表示一个不存在的值。

避免 NULL 会导致您为不存在的项目(0、-1、空字符串等)编造任意特殊值的情况。那将是糟糕的设计。

我建议 80% 的列 应该 声明为 NOT NULL

但是在很多情况下 NULL 是 'natural' 要使用的东西 --

  • 一个 start_time 已知,但 end_time 未知。
  • 可选属性
  • 等等

至于索引,请阅读规则并准备好遵守它们。 PRIMARY KEY 不允许 NULLs,但 UNIQUE 允许。但他们是否被视为 "equal" 或不。

如前所述,IS NULLIS NOT NULL 按预期工作,但 = NULL 没有。另请注意 <=>.

LEFT JOIN 人工创建 NULLs(当 'right' table 的行丢失时)。这种用法的一个例子:

   FROM a
   LEFT JOIN b ON ...
   WHERE b.id IS NULL

请参阅 COALESCE() 了解将 NULL 变成其他东西的方法。示例:

SELECT ...,
       ( SELECT name FROM foo WHERE ... ) AS foo_name,
       ...,
     FROM ...

可以交付 NULL。这样会更友好:

SELECT ...,
       COALESCE(( SELECT name FROM foo WHERE ... ), 'N/A') AS foo_name,
       ...,
     FROM ...

就我个人而言,我经常在这两个地方回避NULL

    string VARCHAR(99) NOT NULL DEFAULT ('') -- empty string is usually good enough
    choice ENUM('unknown', 'this', 'that') NOT NULL  -- easier to display and test

NULLNOT NULL 之间几乎没有性能差异(space 或速度)。