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 NULL
和 IS 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
NULL
和 NOT NULL
之间几乎没有性能差异(space 或速度)。
据我所知,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 NULL
和 IS 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
NULL
和 NOT NULL
之间几乎没有性能差异(space 或速度)。