Re: [SQL ] 如何產生不重覆的准考證號碼?

看板Database作者 (Clemond)時間12年前 (2012/04/29 17:25), 編輯推噓9(900)
留言9則, 9人參與, 最新討論串2/3 (看更多)
※ 引述《Clessin (Clemond)》之銘言: : 小弟用PHP及MySQL寫一個考試線上報名系統,考生於報名頁面填寫完後,系統會即時 : 產生准考證號碼.由於不同科別的考生要領到不同代碼開頭的准考證號碼,例如, : 考國文的考生領到像Ch001,Ch002的准考證號而考英文的領到Eng001,Eng002的准考證號. : 所以在MySQL欄位規劃,准考證號碼的欄位無法單純只用auto_increment來產生不重覆 : 的准考證號碼.我的做法是,先找出資料表中該科目前最後一個准考證號碼是幾號? : 然後把該號碼加1再insert或update. : 現在問題來了,要如何避免數千名不同科別的考生同時上線報名,因為陰錯陽差關係, : 同科別的考生同時按下確定鍵而得到相同的的准考證號碼?雖然說機率很小,但果真 : 發生,那就問題大條了...還請各路高手指導,謝謝! 在此自問自答跟大伙分享.MySQL官方手冊auto_increment約中間說明處 可解決我的問題.原文簡略如下: For MyISAM tables you can specify AUTO_INCREMENT on a secondary column in a multiple-column index. In this case, the generated value for the AUTO_INCREMENT column is calculated as MAX(auto_increment_column) + 1 WHERE prefix=given-prefix. This is useful when you want to put data into ordered groups. 換言之,以我這個問題為例,只要在建立資料表的時候,將考生類別及准考證號 這兩個欄位都設定為primary key,且順序很重要,設定時一定要將考生類別欄位 放在准考證號欄位之前,例如,PRIMARY KEY (grp,id),這樣每新增一筆資料, 系統就會根據這筆資料的考生類別而生出一個屬於這個群組+1的序號給它(絕對 不會重覆).原文手冊例子如下: CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ) ENGINE=MyISAM; INSERT INTO animals (grp,name) VALUES ('mammal','dog'),('mammal','cat'), ('bird','penguin'),('fish','lax'),('mammal','whale'), ('bird','ostrich'); SELECT * FROM animals ORDER BY grp,id; +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+ 手冊連結如下: http://dev.mysql.com/doc/refman/5.5/en/example-auto-increment.html 我此一來,我只要將考生的科別代碼結合系統自動給的流水號,准考證號的 產生就大功告成了(開頭為科別代碼,其後的流水號也都順號,真棒!) 希望對大家有幫助! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 182.235.57.200

04/29 21:03, , 1F
推!試了一下,果真可以,且這表的AUTO_INCREMENT會自動忽略
04/29 21:03, 1F

04/29 22:36, , 2F
喔 好方法
04/29 22:36, 2F

04/30 04:43, , 3F
推!!
04/30 04:43, 3F

04/30 19:06, , 4F
推!找到方法肯再回來分享的人,這年頭不多啦
04/30 19:06, 4F

05/01 08:11, , 5F
原來還可以這樣用,值得推薦
05/01 08:11, 5F

05/02 19:48, , 6F
有學到有推~
05/02 19:48, 6F

05/02 23:43, , 7F
very good.
05/02 23:43, 7F

05/25 00:04, , 8F
推!
05/25 00:04, 8F

06/17 13:49, , 9F
nice
06/17 13:49, 9F
文章代碼(AID): #1FdGadLr (Database)
討論串 (同標題文章)
文章代碼(AID): #1FdGadLr (Database)