你倾向于设置数据库字段的默认值吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xlinux
V2EX    数据库

你倾向于设置数据库字段的默认值吗?

  •  
  •   xlinux 2024-01-12 21:02:45 +08:00 1991 次点击
    这是一个创建于 707 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比方一个商品表,有一个字段 status,表示是否上架 0,1 ,创建商品时,就可以设置状态是否上架,后端在验证参数层,就限定了[0,1],那么你是否还会设置数据库中该字段 status 的默认值?

    由于接收前端传过来的数据,status 肯定是有值的,但是如果时后端程序内部去 new Goods(),不设置 status 的值,这时候入库就会报错。如果给数据库设置了默认值就不会报错。

    14 条回复    2024-01-14 16:18:07 +08:00
    lscho
        1
    lscho  
       2024-01-12 23:24:12 +08:00 via iPhone   1
    是否设置默认值要看业务需求啊
    olaloong
        2
    olaloong  
       2024-01-12 23:26:37 +08:00 via Android   1
    应设尽设
    echo1937
        3
    echo1937  
       2024-01-13 00:01:19 +08:00 via iPhone   1
    应设尽设,null 是万恶之源,有时候字符串我情愿是空字符串,也不希望遇到 null 。
    IvanLi127
        4
    IvanLi127  
       2024-01-13 00:37:59 +08:00 via Android   1
    看实际情况,很多状态类的一般是能设。
    有些像用户手机号这种字符串就允许 null 。
    备注之类的默认空串。
    iseki
        5
    iseki  
       2024-01-13 00:39:08 +08:00   1
    取决于实际情况,大部分情况下都倾向于设置,同时做好约束
    devswork
        6
    devswork  
       2024-01-13 00:42:57 +08:00   1
    设置,比如 0 ,EMPTY_STRING ,但是唯一约束时候就不能空串了,必须 new 时候就设置值。 设置默认值的好处还有一个,就是新增字段设置了默认值,就不用在 java 里再判断 null 处理了,所有新增记录地方也不用处理了,偷懒
    xiaochong0302
        7
    xiaochong0302  
       2024-01-13 09:39:47 +08:00   1
    定义实体类的时候可以给一个默认值呀,new 的时候不就有默认值了。
    wu00
        8
    wu00  
       2024-01-13 11:59:40 +08:00   1
    @echo1937 这么痛恨吗..是开发语言不好处理 null 吗?
    除了唯一索引列不使用 null ,其他还好吧,看业务场景;
    使用 null 就多一种形态:null/0/其他数值,不使用 null 就得加个字段来表示是不是"null"
    xlinux
        9
    xlinux  
    OP
       2024-01-13 15:53:03 +08:00
    @xiaochong0302 既然定义实体类的时候给了默认值,那么在数据库层面还有必要设置默认值吗?
    echo1937
        10
    echo1937  
       2024-01-13 17:32:24 +08:00   1
    @wu00 唯一索引列大部分情况都是允许 null 的,否则未设置值的话,都取 default 值就冲突了;

    数值列,时间列,一般也都是允许 null 的,

    有些业务场景你没法给这些列取默认值,还有可能导致带聚合函数的 sql 失去本意;

    主要是字符串列,会有空串,有 null ,有字符串“null”,有些语言处理起来不优雅;

    如果不在 db 层做限制,代码层面就要考虑,遇上新员工还是有可能漏掉,那从根上解决就最方便了。
    Beats
        11
    Beats  
       2024-01-13 17:53:31 +08:00   1
    大厂一般要求必须设置
    RicherWQ
        12
    RicherWQ  
       2024-01-14 10:14:48 +08:00   1
    除非特殊情况,不然必须设置默认值。专业 DBA 都会这样做。
    jianghu52
        13
    jianghu52  
       2024-01-14 12:14:20 +08:00   1
    默认值基本上是业务最喜欢设置的。但是有一说一,在测试的时候,尤其是还没有完全搭建好脚手架的情况下,做原型测试的时候,这些表的默认值字段是非常讨厌的东西。
    adoal
        14
    adoal  
       2024-01-14 16:18:07 +08:00 via iPhone   1
    是否设置默认值,取决于是否有业务上合理的默认值。
    大多数涉及人员信息的表,性别字段有默认值是没道理的;但是预设主要目标用户群是特定性别但又不排斥其它性别的社交软件,性别字段有默认值就是合理的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     942 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 19:21 PVG 03:21 LAX 11:21 JFK 14:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86