楼主:
a88241050 (å†å›žé 已是百殘身)
2019-05-07 20:42:01是这样的
最近工作上需要写一支程式写资料进数据库
并产生流水号当key值写进字段中
我的想法很单纯
就是直接抓数据库资料笔数
然后拿笔数+1当新增的流水号
写完后交给SA测试
结果他一测马上就出问题了
后来我才知道 原来流水号是要抓最大值+1
而不是一直照顺序编下去
因为这个我被SA当的体无完肤
请问这个是很基本的观念吗?
作者:
g2581856 (irotghio)
2019-05-07 20:47:00我觉得是啦不过以后别再犯就OK了吧,用不着当
SA需求不明确还敢当人喔...产生流水号规则有说/写清楚吗?
作者:
meowyih (meowyih)
2019-05-07 20:51:00... 呃, 这也太新手了
作者:
meowyih (meowyih)
2019-05-07 20:53:00还有这不是auto incremental自动会帮你写吗,为啥要自己手动写?
作者:
sourbait (sourbait)
2019-05-07 20:54:00数据库一般来说要考虑到删除的可能
作者: weinine32 (随意) 2019-05-07 20:55:00
有考虑lock问题吗? 流水号会重复喔!
作者:
alihue (wanda wanda)
2019-05-07 20:58:00我就算第一次学也不会犯这种错
作者:
yyc1217 (somo)
2019-05-07 20:59:00是 不过删除也有分直接删除或是注记删除如果能用数据库本身的流水号更好 除非流水号有要求格式一般来说要删除也要保留资料比较好 毕竟内存不贵查到了 叫soft delete
作者: supernow (善甲狼) 2019-05-07 21:11:00
是的,这很基本,不抓最大的就会有重复的问题
作者: t64141 (榕树) 2019-05-07 21:12:00
满基本的,不过多了一个机会去研究流水号的问题也是好事
作者:
meowyih (meowyih)
2019-05-07 21:21:00google 'sql auto_increment'
比较好奇 SA 为啥会有 max+1 就正确的概念?
作者: Chris926926 (Jan Egeland) 2019-05-07 21:28:00
好奇不用auto increment的原因是?有特殊需求?
作者:
godddddd (howudoing)
2019-05-07 21:30:00看你资历 没事请用sql内建流水号
作者:
q26766 (cancan)
2019-05-07 21:54:00一样错啊哈哈 ,别理有些酸推文,谁没新手过
作者: mackliu (回不去的大叔) 2019-05-07 21:56:00
你们的流水号会不会是设计成文字格式,而且还没设主键?XD
抓最大值+1不就超容易抓到重复 只有第一笔塞得进去
你新手就算了,SA也新手,拜托找个资深的来带一下吧
作者:
jyunwei (jyunwei)
2019-05-07 22:07:00那你以后就会想到了,如果你资历一年内的话啦
作者: abraxas (Abr.) 2019-05-07 22:15:00
他那做法,直接新增一笔溢位笔数减一的资料不就炸掉了
作者:
Label (Panel)
2019-05-07 22:16:00他还没测transation呢
作者:
bill0205 (善良的小孩没人爱)
2019-05-07 22:23:00通常db 的 key都是auto increment吧= =
作者:
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蛮严重的错误 不过如果入行不到半年可以容忍
要加字串还是补左边零的写在程式就好 干嘛放在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
菜到不行
如果我看到这种code应该会把这个人干到火星去吧= =
作者:
bill0205 (善良的小孩没人爱)
2019-05-07 22:52:00题外话 大家是怎么做无序的流水序号
开始写前请先订好test case, 另外有基础知识应该根本不能这样抓....
总笔数+1在跳号的情况下有可能序号重复,有经验的设计应该就要注意这件事...今天就算是Soft delete,也有可能因为一些意外因素导
作者:
jlhc (H)
2019-05-08 00:06:00还是不懂为什么不是auto increment
致资料跳号,不过我好奇设计上有接口可以输入序号还是SA直接加数据库?
作者:
bibo9901 (function(){})()
2019-05-08 00:09:00uuid..
作者:
molopo (mmm)
2019-05-08 00:12:00流水号一直上去就好
作者:
gpctv (gpctv)
2019-05-08 00:27:00这个也要刁,改就好了啊,在我们公司SA地位像狗一样
serial primary key就会自己产生序号+避免重复了
可以在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:004 这种问题就代表 你根本写的时候 很多状况都没想过但是为什么流水号不给DB自动去编
流水号不要自己生,问题很多的。交给 DB,例如 auto Inc之类的功能处理。
作者:
deray (Deray)
2019-05-08 08:36:00流水号干嘛最大值+1 auto increment
抓最大值+1想了一下应该有可能,可是要开transaction保证不会有人写表...有错请指教
作者:
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如果有大量同时写入问题,两个都不行
auto increment如果需要跨table当key不就不能用了
作者: silent5566 (沉默五六) 2019-05-08 09:34:00
直接用DB的sequence去滚不就好了你这两种作法未来table在应用上会很差多人使用的时候没咬住key值很容易有重复的问题
我一开始写也不知道有自动产生的功能 也是跟你一样XD
作者:
testPtt (测试)
2019-05-08 10:45:00设默认值不要用sql写就好啦
作者:
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是
不嫌麻烦可以建立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
基本
作者:
xo1100 (虾蒸河粉)
2019-05-08 22:15:00抓最大+1的话 你之后碰用到多人使用的系统还会再被当一次
作者:
hooll111 (Katsudon)
2019-05-09 01:32:00这个还蛮基本的耶 取笔数超抖...
作者:
deanh (夜想者)
2019-05-09 04:44: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删除的话 那完全就妳问题了
这怎么会是自己新增 DB不是有自动流水号 column不用填啊
作者:
owen5566 (ooooowen)
2019-05-12 07:50: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的心态