带日期前缀的唯一标识符混合格式(Php / MySQL)


Unique Identifier Mixed Format with Date Prefix (Php / MySQL)

我正在创建一个票务系统,它将跟踪客户创建的票务。票证的基本信息将存储在表'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

正如我所理解的,你想让两个不同的字段,如datefieldticketnumfield的一个结果

在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更新数据库,以便下次使用它们。

希望能有所帮助。