作者:
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, 另外有基礎知識應該根本不能這樣抓....
作者: lukelove (午睡) 2019-05-07 22:56:00
比較大的問題是 開發前沒有先查怎麼設計就土砲做
總筆數+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是
作者: 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
基本
作者:
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的心態