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