Mysql 字段有必要都设置为 not null 吗

2021-12-09 10:37:15 +08:00
 llisit

昨天公司事故复盘,提到字段最好都设置为 not null ,有几个疑问:

  1. allow null 比 not null 字段每行会多占用 1 字节的标志位,这个是否可以忽略不记?
  2. not null 能够带来更好的性能吗?
  3. 对于 Integer 类型,not null 字段给一个默认值如 0 表示值为空,是不是使用 null 表示语义化会更好?
2598 次点击
所在节点    问与答
13 条回复
zoharSoul
2021-12-09 10:39:01 +08:00
如果不是需要 null 语义的, 建议都设成 not null
kiripeng
2021-12-09 10:41:40 +08:00
如果这个字段之后要用来构建索引的话,会导致索引树构建复杂性能下降,对于一些查询的情况根据不同的数据库得到的结论不一定是一样的意思,数据迁移会比较麻烦,等等情况吧
Mohanson
2021-12-09 10:42:53 +08:00
Null References: The Billion Dollar Mistake - Tony Hoare

注: Tony Hoare 是 Null 语义的发明者

<amp-youtube data-videoid="ybrQvs4x0Ps" layout="responsive" width="480" height="270"></amp-youtube>
winnie2012
2021-12-09 10:44:39 +08:00
都给个默认值比较好,Null 对于 索引 不友好
h82258652
2021-12-09 11:35:34 +08:00
看业务,业务可 null 就 null ,业务不可 null 就 not null
2123123
2021-12-09 11:37:07 +08:00
不涉及索引的字段还是看业务场景,比如一个金额字段 0 在业务中也是有意义的,用 null 表示未设值我认为这是合理的。
dqzcwxb
2021-12-09 11:45:11 +08:00

说 null 不走索引的大概和之前说 or 不走索引(特定情况下 or 才不走索引)的人是同一拨
sagaxu
2021-12-09 12:19:49 +08:00
孝子贤孙
makelove
2021-12-09 12:23:56 +08:00
这难道不是该怎么用就怎么用吗?难道没日期也要强行搞个空日期值出来
Jooooooooo
2021-12-09 12:51:26 +08:00
最好是, 给自己少埋坑.
gadfly3173
2021-12-09 15:30:46 +08:00
mysql 的 null 和 null 之间是不一样的,所以会导致唯一索引失效。
是否允许 null 还是和业务有关的,一般来说如果一个字段不应该为 null 那自然就应该设 not null
yidinghe
2021-12-09 17:35:22 +08:00
cccer
2021-12-11 16:34:08 +08:00
@dqzcwxb Oracle 可为空的字段在 order by 的时候会导致索引失效,MySQL 没试过。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/821057

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX