[请益] 这是个很低级的错误吗?

楼主: a88241050 (再回頭已是百殘身)   2019-05-07 20:42:01
是这样的
最近工作上需要写一支程式写资料进数据库
并产生流水号当key值写进字段中
我的想法很单纯
就是直接抓数据库资料笔数
然后拿笔数+1当新增的流水号
写完后交给SA测试
结果他一测马上就出问题了
后来我才知道 原来流水号是要抓最大值+1
而不是一直照顺序编下去
因为这个我被SA当的体无完肤
请问这个是很基本的观念吗?
作者: g2581856 (irotghio)   2019-05-07 20:47:00
我觉得是啦不过以后别再犯就OK了吧,用不着当
作者: diabloevagto (wi)   2019-05-07 20:48:00
你自己测试测不出来吗???
作者: abccbaandy (敏)   2019-05-07 20:50:00
SA需求不明确还敢当人喔...产生流水号规则有说/写清楚吗?
作者: meowyih (meowyih)   2019-05-07 20:51:00
... 呃, 这也太新手了
作者: abccbaandy (敏)   2019-05-07 20:52:00
另外第二种作法有考虑multi thread吗?
作者: meowyih (meowyih)   2019-05-07 20:53:00
还有这不是auto incremental自动会帮你写吗,为啥要自己手动写?
作者: wayne12345 (lightrain)   2019-05-07 20:53:00
作者: sourbait (sourbait)   2019-05-07 20:54:00
数据库一般来说要考虑到删除的可能
作者: weinine32 (随意)   2019-05-07 20:55:00
有考虑lock问题吗? 流水号会重复喔!
作者: MOONY135 (谈无欲)   2019-05-07 20:56:00
要看需求吧
作者: alihue (wanda wanda)   2019-05-07 20:58:00
我就算第一次学也不会犯这种错
作者: yyc1217 (somo)   2019-05-07 20:59:00
是 不过删除也有分直接删除或是注记删除如果能用数据库本身的流水号更好 除非流水号有要求格式一般来说要删除也要保留资料比较好 毕竟内存不贵查到了 叫soft delete
作者: alan3100 (BOSS)   2019-05-07 21:07:00
流水号由DB产生是基本, 除非你有其他特殊需求
作者: supernow (善甲狼)   2019-05-07 21:11:00
是的,这很基本,不抓最大的就会有重复的问题
作者: t64141 (榕树)   2019-05-07 21:12:00
满基本的,不过多了一个机会去研究流水号的问题也是好事
作者: alan3100 (BOSS)   2019-05-07 21:14:00
抓最大+1也是错的 除非你一次只insert一笔
作者: meowyih (meowyih)   2019-05-07 21:21:00
google 'sql auto_increment'
作者: benjamin99 (BigPaPa)   2019-05-07 21:23:00
比较好奇 SA 为啥会有 max+1 就正确的概念?
作者: Chris926926 (Jan Egeland)   2019-05-07 21:28:00
好奇不用auto increment的原因是?有特殊需求?
作者: googoo1102 (googoo)   2019-05-07 21:29:00
保险起见把流水号字段设成unique
作者: godddddd (howudoing)   2019-05-07 21:30:00
看你资历 没事请用sql内建流水号
作者: x000032001 (版废了该走了)   2019-05-07 21:50:00
同时插两笔抓max也是爆炸
作者: q26766 (cancan)   2019-05-07 21:54:00
一样错啊哈哈 ,别理有些酸推文,谁没新手过
作者: mackliu (回不去的大叔)   2019-05-07 21:56:00
你们的流水号会不会是设计成文字格式,而且还没设主键?XD
作者: GoodFriday (好星期五)   2019-05-07 21:59:00
抓最大值+1不就超容易抓到重复 只有第一笔塞得进去
作者: ripple0129 (perry tsai)   2019-05-07 22:00:00
你新手就算了,SA也新手,拜托找个资深的来带一下吧
作者: LinuxKernel (Linus Torvalds)   2019-05-07 22:06:00
作者: jyunwei (jyunwei)   2019-05-07 22:07:00
那你以后就会想到了,如果你资历一年内的话啦
作者: crossdunk (推嘘自如)   2019-05-07 22:13:00
很基本阿,可是为什么是SA测试呀
作者: ChungLi5566 (中坜56哥)   2019-05-07 22:14:00
非本科? 实务上流水号都给db自己编啊
作者: crossdunk (推嘘自如)   2019-05-07 22:15:00
他的流水号应该是前面还需要加其他东西
作者: abraxas (Abr.)   2019-05-07 22:15:00
他那做法,直接新增一笔溢位笔数减一的资料不就炸掉了
作者: Label (Panel)   2019-05-07 22:16:00
他还没测transation呢
作者: kurtsgm   2019-05-07 22:19:00
4
作者: ChungLi5566 (中坜56哥)   2019-05-07 22:20:00
作者: bill0205 (善良的小孩没人爱)   2019-05-07 22:23:00
通常db 的 key都是auto increment吧= =
作者: abccbaandy (敏)   2019-05-07 22:24:00
好奇到底什么使用情境可以想出这种神奇作法...
作者: bill0205 (善良的小孩没人爱)   2019-05-07 22:24:00
我自己是会做两种序号 一种是db 一种是显示的SN
作者: rahit (水元素)   2019-05-07 22:31:00
这东西一般数据库都能自动给…
作者: cloudgoogle (漫步在云端)   2019-05-07 22:35:00
单纯抓max一样也是有问题 多人同时操作的执行顺序...
作者: drajan (EasoN)   2019-05-07 22:38:00
蛮严重的错误 不过如果入行不到半年可以容忍
作者: ChungLi5566 (中坜56哥)   2019-05-07 22:42:00
要加字串还是补左边零的写在程式就好 干嘛放在table占DB磁盘空间
作者: bill0205 (善良的小孩没人爱)   2019-05-07 22:43:00
有序的就照C大方法 或是把字串丢到另外字段 捞出来时后再组起来 无序比较麻烦
作者: ashlikewing   2019-05-07 22:44:00
流水号自己做太扯了啦
作者: cloudgoogle (漫步在云端)   2019-05-07 22:46:00
如果可以捞出来另外处理当然是最好 不过有的Table是要给别人存取的,可能就没办法控制在自己这边即便如此,还是可以像bill大说的存两栏可能好一点
作者: onlyeric23 (MiGG)   2019-05-07 22:49:00
菜到不行
作者: you878787 (048787)   2019-05-07 22:51:00
如果我看到这种code应该会把这个人干到火星去吧= =
作者: ChungLi5566 (中坜56哥)   2019-05-07 22:51:00
通常别系统来存取 是走API而不会直连DB
作者: bill0205 (善良的小孩没人爱)   2019-05-07 22:52:00
题外话 大家是怎么做无序的流水序号
作者: you878787 (048787)   2019-05-07 22:55:00
开始写前请先订好test case, 另外有基础知识应该根本不能这样抓....
作者: lukelove (午睡)   2019-05-07 22:56:00
比较大的问题是 开发前没有先查怎么设计就土砲做
作者: jinmin88 (昼伏夜出)   2019-05-07 23:10:00
菜到不行的问题
作者: blackie1019 (blackie)   2019-05-07 23:39:00
两个都会笑到翻过去
作者: crossdunk (推嘘自如)   2019-05-07 23:57:00
无序怎么叫做流水XD
作者: Darkword1987 (黑字)   2019-05-07 23:58:00
资料笔数减少不就GG了
作者: CloudyWing (孤单ㄉ翼)   2019-05-08 00:01:00
总笔数+1在跳号的情况下有可能序号重复,有经验的设计应该就要注意这件事...今天就算是Soft delete,也有可能因为一些意外因素导
作者: jlhc (H)   2019-05-08 00:06:00
还是不懂为什么不是auto increment
作者: CloudyWing (孤单ㄉ翼)   2019-05-08 00:07:00
致资料跳号,不过我好奇设计上有接口可以输入序号还是SA直接加数据库?
作者: bibo9901 (function(){})()   2019-05-08 00:09:00
uuid..
作者: molopo (mmm)   2019-05-08 00:12:00
流水号一直上去就好
作者: gpctv (gpctv)   2019-05-08 00:27:00
这个也要刁,改就好了啊,在我们公司SA地位像狗一样
作者: sachung28 (00)   2019-05-08 00:28:00
serial primary key就会自己产生序号+避免重复了
作者: viper9709 (阿达)   2019-05-08 00:28:00
流水号不用也不能自己做吧...
作者: sachung28 (00)   2019-05-08 00:33:00
可以在SQL写入DB时顺便用return回传+改格式 前提是DB有支援...另外 删除并重塞资料测序号产生逻辑ok 但我第一次看到QA自己塞数字当流水号如果是UI呈现美观 流水号要补字串 这可以API hard code处理 或是另外开个流水号前缀字的定义表储存 查询时将前缀和序号串起来建议你去恶补一下DB观念 学会用DB能省很多写程式的时间
作者: bitcch (必可取)   2019-05-08 01:36:00
作者: mathrew (Joey)   2019-05-08 06:23:00
4 这种问题就代表 你根本写的时候 很多状况都没想过但是为什么流水号不给DB自动去编
作者: brianhsu (坟墓)   2019-05-08 07:26:00
流水号不要自己生,问题很多的。交给 DB,例如 auto Inc之类的功能处理。
作者: deray (Deray)   2019-05-08 08:36:00
流水号干嘛最大值+1 auto increment
作者: qpowjohn (pose)   2019-05-08 08:44:00
抓最大值+1想了一下应该有可能,可是要开transaction保证不会有人写表...有错请指教
作者: xdraculax (首席怪叔叔)   2019-05-08 08:51:00
总数加一很瞎,最大加一也只是50步笑百步
作者: y3k (激流を制するは静水)   2019-05-08 08:57:00
这就是菜而已吧
作者: luluking (luluking)   2019-05-08 09:03:00
你不觉得这样写反而麻烦
作者: lion0208 (TGK)   2019-05-08 09:10:00
为何不用 auto increment?另外取最大+1,同时间确定只会有一个 process/thread 在写?
作者: mago (mago)   2019-05-08 09:14:00
如果有大量同时写入问题,两个都不行
作者: CodingMan (程式侠)   2019-05-08 09:19:00
换个想法你就知道答案了 难不成这是高级问题吗?
作者: lazarus1121 (...)   2019-05-08 09:20:00
auto increment如果需要跨table当key不就不能用了
作者: silent5566 (沉默五六)   2019-05-08 09:34:00
直接用DB的sequence去滚不就好了你这两种作法未来table在应用上会很差多人使用的时候没咬住key值很容易有重复的问题
作者: hakama99 (杂酱面)   2019-05-08 10:18:00
我一开始写也不知道有自动产生的功能 也是跟你一样XD
作者: testPtt (测试)   2019-05-08 10:45:00
设默认值不要用sql写就好啦
作者: johnny9144 (Johnny)   2019-05-08 11:23:00
4
作者: f124 (....)   2019-05-08 11:25:00
叫数据库自己跑流水号就好 还自己编干嘛...
作者: iamshiao (CircleHsiao)   2019-05-08 11:34:00
是,而且拿 max 也可能会有问题,用数据库本身提供的自动增加机制比较好
作者: seedli (带骨的火腿)   2019-05-08 12:13:00
除非系统只有一个人用,不然抓max+1可能有race condition
作者: worf   2019-05-08 14:08:00
...
作者: amyt (amyt)   2019-05-08 14:25:00
作者: laker780304 (板凳一朗)   2019-05-08 15:20:00
不嫌麻烦可以建立Sequence,新增时取Sequence用即可
作者: zg0608x (眼睛長在腳底下)   2019-05-08 17:17:00
好有创意的方法
作者: indexcome (My Happiness)   2019-05-08 17:24:00
其实就算没讲清楚需求。这种可能发生的情况写code的人应该都会注意到的.
作者: BignoZe (BignoZe)   2019-05-08 17:59:00
照常理不太会这样写
作者: rocwild (外国死小孩)   2019-05-08 18:30:00
基本
作者: GinginDenSha (gingin)   2019-05-08 19:00:00
两个都4
作者: xo1100 (虾蒸河粉)   2019-05-08 22:15:00
抓最大+1的话 你之后碰用到多人使用的系统还会再被当一次
作者: stupid0319 (征女友)   2019-05-09 00:09:00
是SA太浅了
作者: hooll111 (Katsudon)   2019-05-09 01:32:00
这个还蛮基本的耶 取笔数超抖...
作者: deanh (夜想者)   2019-05-09 04:44:00
你们两个都错了啊,搞笑
作者: gettheworld (Hope)   2019-05-09 12:53:00
觉得是想展现优越感
作者: zerrofighter   2019-05-09 14:13:00
这种事情就是炸过一次就知道了
作者: mdkn35 (53nkdm)   2019-05-09 14:23:00
我都用uuid
作者: DerLuna (阳月)   2019-05-09 15:54:00
这两个方法都不好吧
作者: cholux   2019-05-09 18:04:00
是有一点,不过看问题可能会有更好的作法
作者: panpan (ㄚㄚㄚ)   2019-05-09 20:32:00
笑死 看到两个菜鸡户啄
作者: Frecci (穿出清新)   2019-05-09 22:45:00
妳太菜是真的 但是不代表他能够直接进入db删资料假设是用ui删除的话 那完全就妳问题了
作者: paulshain04 (paulshain04)   2019-05-10 09:09:00
这怎么会是自己新增 DB不是有自动流水号 column不用填啊
作者: owen5566 (ooooowen)   2019-05-12 07:50:00
== 这样写怎么可能没问题
作者: rickboo0809 (柳澄)   2019-05-12 10:41:00
超低级
作者: Tony427 (重新出发...fight!!)   2019-05-13 14:25:00
不管基本不基本,犯错要搞懂为何不能这样做,以及找出最佳做法,至少下次不要再犯
作者: newhandfun (新手方)   2019-05-15 08:51:00
想必阁下跟我一样是没人带的菜鸟吧,能够发现问题提早解决真是件好事。
作者: silent5566 (沉默五六)   2019-05-16 10:35:00
大家也不用嘲讽吧 每个人也是爆炸中成长QQ推Tony的心态

Links booklink

Contact Us: admin [ a t ] ucptt.com