[請益] 這是個很低級的錯誤嗎?

作者: 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