作者Clessin (Clemond)
看板Database
標題Re: [SQL ] 如何產生不重覆的准考證號碼?
時間Sun Apr 29 17:25:56 2012
※ 引述《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
1F:推 dio833:推!試了一下,果真可以,且這表的AUTO_INCREMENT會自動忽略 04/29 21:03
2F:推 LaPass:喔 好方法 04/29 22:36
3F:推 carlcarl:推!! 04/30 04:43
4F:推 jackghost:推!找到方法肯再回來分享的人,這年頭不多啦 04/30 19:06
5F:推 jenglue:原來還可以這樣用,值得推薦 05/01 08:11
6F:推 bluepromise:有學到有推~ 05/02 19:48
7F:推 kanx:very good. 05/02 23:43
8F:推 AreTheyYou:推! 05/25 00:04
9F:推 SMUGEN:nice 06/17 13:49