Re: [SQL ] 如何產生不重覆的准考證號碼?
※ 引述《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
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
05/02 23:43, 7F
推
05/25 00:04, , 8F
05/25 00:04, 8F
推
06/17 13:49, , 9F
06/17 13:49, 9F
討論串 (同標題文章)