[mysql 字段] not null 还是 null default

2022-09-04 18:52:16 +08:00
 RedBeanIce

问题:如图,字段值的设置

今天在看一篇文章,设计数据库的时候所有字段都设置为 not null ,并且给默认值 default null/0 ,我感觉这是不符合实际场景的

我回想我入门的时候也看到过这样子的文章,但是我工作了两三年后发现,我都是根据业务实际来做的,业务允许为空那就是 null ,业务不允许为空我就给 not null ,这个是否必填由产品说了算。

至于 default 属性,是只有选择框,下拉框才需要做的事情。否则都没有 default

==========================隔断线=======

null 还是 not null:根据产品要求来设计

default:根据实际场景,一般只在下拉框等场景使用

如上,请各位指教,我这样应该是对的吧,这类似的文章都是不符合实际的吗?

5148 次点击
所在节点    Java
53 条回复
dobelee
2022-09-05 01:03:27 +08:00
@RedBeanIce 你可以能搞错了,显示的问题应该由外层处理的。大多数情况可以用零值作为默认值的。
难道你想通过判断空指针来检查是否保存?这样是不靠谱的,结果可能随着不同语言的特性而变化。
phithon
2022-09-05 01:12:09 +08:00
@GTim 国际化不用 RFC3339(ISO 8601)用时间戳?这么说 Django 不是国际化框架了
iseki
2022-09-05 02:05:56 +08:00
@Oktfolio 我这边的做法都是代码中只出现时间类型,Java 里用 Instant Go 里用 time.Time ,系统边界尽量用 RFC3339 字符串传递
iseki
2022-09-05 02:09:14 +08:00
我倾向于是否允许 null 跟着业务走,尽量不用零值做特殊值,null 就是 null ,0 就是 0
kiwi95
2022-09-05 07:15:34 +08:00
@RedBeanIce 一般都能接受。其实说白了都是为了自己方便,减少出问题的点,dba 不想要 null 值是为了防止 MySQL 莫名其妙的问题,研发为了 SQL 能过审核并且能少一些空指针判断 /避免指定义针类型也想自己方便就都 not null 。

产品不同意就去说服他们。
ksc010
2022-09-05 08:04:45 +08:00
国际化 用 ISO 啊
GTim
2022-09-05 09:18:35 +08:00
@iseki
@zpf124
@a132811

带时区,前端要先 parse 一次,然后再 format 一次对吧。这种东西没有对错,如果一开始就是国际化的,怎么做都好说,一开始没有国际化的,又倾向于可能会有,我觉得 bigint 是合适的
lolizeppelin
2022-09-05 10:12:26 +08:00
@RedBeanIce
你傻哦 遇到 0 的前端显示未设置不就行了...

但是这个字段有唯一索引就必须 null 了,否则就设 0 前端对 0 特殊处理
用 0 不用 null 是索引问题
RedBeanIce
2022-09-05 10:30:02 +08:00
@dobelee
@lolizeppelin
@ilylx2008
那么问题来了,用户输入了一个 0 ,后端返回给前端,怎么知道是用户输入的 0 ,还是 mysql 默认值的 0
用户说,我明明输入了。为啥没了。
RedBeanIce
2022-09-05 10:30:34 +08:00
@kiwi95 请看上一条
meiyoumingzi6
2022-09-05 10:35:51 +08:00
看到归类到 java

我想站在其他语言角度来看,
python 想搞这个事情也是 so easy ,
golang 就略蛋疼了,如果是 null ,就不得不在创建 struct 的时候把字段设置成指针类型,害,要不他就是零值,即:字符串类型是空串,数字类型是 0
morty0
2022-09-05 10:46:42 +08:00
@RedBeanIce 用户输入需要避开默认值
pastor
2022-09-05 12:24:22 +08:00
@RedBeanIce #29

对于用户是否应该必填字段,产品规则是可控的,即使不需要用户输入;
默认值也是产品规则可控的,比如字符串类型,一般默认就"",用户如果可以不输入,""也没问题。数值类型 0 值同样道理。

但是数据库 null 对于不同语言处理起来可能会遇到不同的麻烦。而对于默认值。

不喜欢 not null default 的各位,建议还是反思下自己吧

支持 not null default +1
支持 bigint 时间戳 +1
iseki
2022-09-05 12:46:21 +08:00
@RedBeanIce 用 Unix 时间戳也不是不行,这个问题和时区也没什么关系,就是 RFC3339 是明确的标准,时间戳就稍差点。
我的重点是不管用哪种,前端都需要处理,不是说用时间戳前端就省多少事
iseki
2022-09-05 12:48:27 +08:00
@pastor 使用零值就没有麻烦了吗🤣
lovelylain
2022-09-05 13:12:13 +08:00
@GTim db 用 datetime 存,db 访问模块转换为时间戳,国际化会有什么问题吗?
RedBeanIce
2022-09-05 13:24:53 +08:00
@pastor
请问一下,一个非必填字段。如何判断用户输入 0 ,还是 default 0 ,,

用户这个字段没有输入,回显的时候你给个 0 返回出去,不是扯淡了。。产品不知道是否可以接受这种处理方式。

请指教
lovelylain
2022-09-05 13:25:29 +08:00
@iseki 可以去了解下 protobuf3 ,尽量把零值作为缺省的特殊值,例如零值表示未设置。很多地方都是可以避免零值作为业务值的。
RedBeanIce
2022-09-05 13:25:58 +08:00
@pastor 产品规则可控,感觉好麻烦。。。。
sunmoon1983
2022-09-05 13:26:35 +08:00
@fengpan567 那你修改了没有呀?我也碰到了这种情况!

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

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

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

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

© 2021 V2EX