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

标签 php mysql record auto-increment uniqueidentifier

我正在创建一个票务系统,用于跟踪客户创建的票证。票证的基本信息将存储在表'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 数据库?另外,如何防止 PHP 中唯一 ID 出现重复值的可能性?将会有非常大量的客户使用该表插入记录。

最佳答案

如何使用自动增量并将其与日期字段相结合来生成该日期的序列号,从而生成 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。假设您过去从未重新添加票证,即使在大量使用的情况下,也只需要这两个查询。

[编辑]实际上,在研究了这一点之后,有一种更好的方法可以在 MySQL 中本地执行此操作。如果您定义两列(日期和序列)并将它们作为主键(两列),并将序列字段作为自动增量,那么 MySQL 会将序列列更新为每个日期的自动增量(即,它将以值开始)每个日期 1 个)。

[编辑]遵循这些原则的表结构可以为您完成这项工作:

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

关于php - 带日期前缀的唯一标识符混合格式 (Php/MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8036298/

相关文章:

php - 具有代码完成功能的最小 PHP IDE?

Mysql 列重复

mysql - 追踪系统数据库结构

vhdl - 如何使用 VHDL 中的整数引用从记录中提取元素?

php - 如何去除除字母数字、下划线和破折号以外的所有字符?

php - 我可以使用 define 方法更改常量值。如何克服这个问题...?

php - 两个表的逻辑问题

class - OCaml中具有相似字段的记录

c# - 使用 'with' 关键字复制记录结构时重新初始化仅获取属性

php - 查找并替换YouTube网址