我正在创建一个票务系统,它将跟踪客户创建的票务。票证的基本信息将存储在表'tickets'中,其结构如下:
Primary Key (int 255)
Ticket_Key (varchar)
Ticket Number (varchar 500)
Label
Date Created
Delete
and so on..
问题是最终会有大量的票,我们需要一种更统一的方式来识别票。我想PHP创建一个票号的票号,将包含混合值。日期(格式为20111107),后面跟着一个自动递增的值1001。1002, 1003,…)。例如,票号为201111071001。
问题是我如何在PHP编程这插入到MySQL数据库?此外,我如何防止重复的值在唯一的Id在PHP的可能性?将会有非常大量的客户使用该表来插入记录。
使用自动增量并将其与日期字段相结合以生成该日期的序列号,从而生成ticketId。
那么你的插入过程应该是这样的:
INSERT INTO table (...ticket info...)
然后检索该行的自动增量并运行如下查询
UPDATE table SET sequence = (SELECT ($id-MAX(auto_increment)) FROM table WHERE date_created=DATE_SUB(CURDATE(),INTERVAL 1 DAY)) WHERE auto_increment=$id
然后您可以轻松地创建YYYMMDDXXXX格式的ticketId。假设您从未在过去回溯添加票据,那么即使在大量使用的情况下,也只需要这两个查询。
[EDIT]实际上,在研究了这个之后,在MySQL中有一个更好的方法来做这个。如果你定义了两列(日期和序列),并使它们成为主键(两列),序列字段作为自动增量,那么MySQL将更新序列列作为每个日期的自动增量(即它将从每个日期的值1开始)。
[EDIT]这样的表结构可以为您完成工作:
CREATE TABLE IF NOT EXISTS `table` (
`created_date` date NOT NULL,
`ticket_sequence` int(11) NOT NULL auto_increment,
`label` varchar(100) NOT NULL,
[other fields as required]
PRIMARY KEY (`created_date`,`ticket_sequence`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
在检索数据时,您可以这样做
SELECT CONCAT( DATE_FORMAT(created_date,'%Y%m%d'),LPAD(ticket_sequence,4,'0')) AS ticket_number, other fields.... FROM table
正如我所理解的,你想让两个不同的字段,如datefield
和ticketnumfield
的一个结果
在mysql中,你可以通过命令:
SELECT concat( datefield, ticketnumfeild ) FROM `tbl_name`
这个查询返回的结果像201111071001
我以前做过这样的事情,我想在每个新的一天刷新计数器。不幸的是,我不会说PHP,所以你将不得不满足于解释和一些伪代码。
首先,在配置文件中创建几个字段来跟踪计数器。这应该是一个日期字段和一个数字字段…
LastCount (Number)
LastCountDate (Date)
然后确保数据库表中的票号字段设置为唯一值,因此如果您试图插入重复的票号,则会抛出错误。
然后在你的代码中,你加载你的计数器值(LastCount和LastCountDate),你像这样处理它们…
newCount = LastCount;
if LastCountDate == Today
increment newCount (newCount++)
else
reset newCount (newCount = 1)
你可以使用newCount来创建你的票号
接下来,当您尝试插入一行时,如果成功,那么很好。如果失败,则需要再次增加newCount,然后再次尝试插入操作。重复此操作,直到插入成功(将其放入循环中)
成功插入行后,需要使用刚才用于生成票号的Count Values更新数据库,以便下次使用它们。
希望能有所帮助。