[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:根据实际场景,一般只在下拉框等场景使用

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

5459 次点击
所在节点    Java
53 条回复
akira
2022-09-04 19:05:39 +08:00
看实际情况来,尽信书不如无书
GTim
2022-09-04 19:58:02 +08:00
这几年的经验来看,能 `not null` 的都 `not null`,默认值能不 `null` 的就不要 `null`
fengpan567
2022-09-04 20:02:02 +08:00
待过一家公司也是按这个规范来的,真的蠢。审核人员把我提交的 sql 脚本打回来,说里的所有字段必须有默认值并且不准为 null ,可我时间字段怎么给你默认值,这个时间是用户自己去填的,争论了几句还是让我改,说自己不管业务只管审核
PendingOni
2022-09-04 20:05:15 +08:00
主要看那些字段是不是出现在建立的索引上或者在视图上比较常用
XiLingHost
2022-09-04 20:05:33 +08:00
@fengpan567 时间如果非要有个默认值,我觉得可以用`1970-01-01T00:00:00.000Z`
GTim
2022-09-04 20:06:50 +08:00
@fengpan567 做过国际化的基本都有一个共识:能用 bigint 来保存时间,都不要用 timestamp 或者 datetime ,不然后期可能是个超级大工程
fengpan567
2022-09-04 20:11:57 +08:00
@XiLingHost 我直接用字符串存时间了,反正已经跑路。。。
xxbing
2022-09-04 20:29:38 +08:00
@GTim 不能同意更多. 后期需要什么格式 前端 format 就行了
zpf124
2022-09-04 21:12:35 +08:00
@GTim 可以存入数据库的时间都使用 UTC 时间,程序读取和写入的时候做转换。
zjp
2022-09-04 21:53:45 +08:00
#2 一样的情况。要存的是金额,null 值、负数和零都是实际场景下存在的。那就只能用字符串了
iseki
2022-09-04 21:59:28 +08:00
@GTim 说的好像用 timestamp datetime 前端不用格式化似的。啊,你们不会都拿 String 传时间吧
lolizeppelin
2022-09-04 22:55:23 +08:00
@zpf124
linux 时间就是 utc 的

一般情况下字段都应该 not null,尽量用空字符串或者 0 来表达空,避免索引问题

当字段有是外键或唯一索引的时候,字段只能用到 null 占位,这时候就得允许 null
Oktfolio
2022-09-04 22:57:21 +08:00
@iseki 我们就是这么干的,返回给前端,前端传的都是 yyyy-MM-dd HH:mm:ss ,刚看到的时候我人都惊呆了
ilylx2008
2022-09-04 23:14:47 +08:00
所有字段 not null+默认值
RedBeanIce
2022-09-04 23:22:40 +08:00
@ilylx2008

但是我好奇为什么呢,如果不是下拉框这种规定死的,

你一个数值字段,保存是没填的,回显返回一个 0 ,产品或者业务方无法接受你怎么办。
oneisall8955
2022-09-04 23:42:58 +08:00
@ilylx2008 #14
@GTim #6

层遇到个业务场景,客户支付时间,MySQL 字段类型是 datetime ,对应 Java 是 java.util.Date ,如果 db 要 not null ,在程序上兼容?
dobelee
2022-09-04 23:46:05 +08:00
避免空指针问题。
RedBeanIce
2022-09-05 00:11:19 +08:00
@dobelee 但是我好奇为什么呢,如果不是下拉框这种规定死的,

你一个数值字段,保存是没填的,回显返回一个 0 ,产品或者业务方无法接受你怎么办。
a132811
2022-09-05 00:15:29 +08:00
@GTim 你们做国际化时,传时间都不带时区吗?我们都统一用 rfc3339 表示
IvanLi127
2022-09-05 00:45:35 +08:00
@GTim 你们国际化和存啥类型的数据有啥关系?不应该考虑存的时间带不带时区么?

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

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

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

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

© 2021 V2EX