字段尽量设置为 not null 是 Mysql 特有的惯例吗?其他的数据库(例如 Postgres)需要这样做吗?

2018-05-04 13:16:15 +08:00
 SimbaPeng
4158 次点击
所在节点    程序员
28 条回复
MeteorCat
2018-05-04 13:20:43 +08:00
默认 null 占据一个数据一个字节,每条数据多分配一个字节的空间来表示字段是否为空,无论你是否使用到 null
MeteorCat
2018-05-04 13:27:33 +08:00
Postgres 没接触过,mysql 和 mariadb 就是这样,不排除其他数据库软件有所优化
SimbaPeng
2018-05-04 13:31:32 +08:00
@MeteorCat 设置了 not null 的话,像 datetime 这种数据类型如何给默认值?
sagaxu
2018-05-04 13:35:45 +08:00
比如说温度,你用什么值表示这项数据无效?不用 null 再加个字段吗?
congeec
2018-05-04 13:37:11 +08:00
@sagaxu -1 kelvin degree
MeteorCat
2018-05-04 13:38:11 +08:00
@SimbaPeng
如果需要不留空,比如 create_datetime 这种创建就需要生成的,就直接当时的时间默认值
如果需要留空,那么比如 update_datetime 这种实时更新,但是前期不留空的,直接给他一个会被识别为 null 字符串 `"0000-00-00 00:00:00"`;如果取出来的话,需要判断是不是该格式,我一般都是时间戳保存转换
shansing
2018-05-04 13:39:24 +08:00
@congeec 0 度就行了 :doge:
niubee1
2018-05-04 13:39:27 +08:00
比如你定义一个字段是 boolean 类型, 但是如果不是 not null 的话, 而你又忘记给这个字段赋值, 那么, 这个字段就会有 null, false, true 三个状态
MeteorCat
2018-05-04 13:39:45 +08:00
@sagaxu 这种情况也是需要考虑,建议楼主也纳入这种考虑
MeteorCat
2018-05-04 13:40:49 +08:00
@shansing 不行,现实上测试过,0 在温度面前也是个特殊值,因为有的地方温度也是存在 0 度,不能将具体存在的温度纳入错误之中
PressOne
2018-05-04 13:41:45 +08:00
新版 MySQL 早就没有这个必要了,按需设置,没有数据就 Null,不用强求,不影响索引效率。
sagaxu
2018-05-04 13:42:17 +08:00
@congeec 然后用求和或者平均等函数做聚集的时候再 where 筛一下先?
congeec
2018-05-04 13:43:34 +08:00
@niubee1 这种情况用 0,1,2 表示更省空间。而且适合用 bitmap 索引
congeec
2018-05-04 13:46:22 +08:00
@sagaxu 嗯啊,你说的对。可能一不小心就写错了。性能倒不是问题
alvinbone88
2018-05-04 14:54:44 +08:00
MySQL 里字段尽量不要为空主要是为了排序的考虑,而不是索引的考虑
在 MySQL 里,null 值永远是最小的,而且 null 与其他任何值比较的结果都是 false
这就导致用 ASC 排序时 null 值永远在最前面
lihongjie0209
2018-05-04 15:07:13 +08:00
@MeteorCat #10 -99999 考虑一下, 之前看到有人用 unix time 的开始时间作为时间的默认值或者是异常值
jjx
2018-05-04 16:44:06 +08:00
最好取默认值, 否则实际操作中很麻烦

比方说 pg, 要取空白的记录需要

select * from sale_orders where source is null or source='';
MeteorCat
2018-05-04 17:30:25 +08:00
@lihongjie0209 这种代码层面的验证移交给数据库本身就是极其错误的,数据库不对数据准确性负责,只负责你有数据 insert 没有错误就行了
MeteorCat
2018-05-04 17:45:54 +08:00
@lihongjie0209 对了,这种还涉及数据库字段的正确配置,比如你 datetime|tinyint 强制硬塞给一个"123456789"|9999----->"0000-00-00 00:00:00"|255,这种我感觉有点离题但是却是个值得思考的问题,因为一方面制定数据库得考虑这些,一方面还要在 DAO 层做这样的判断
niubee1
2018-05-04 18:42:31 +08:00
@congeec 我说的这是一个问题而不是一个特性啊, 你没 get 到点

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

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

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

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

© 2021 V2EX