根据日期创建主键

时间:2011-03-28 06:35:29

标签: php mysql

我正在尝试根据创建记录的日期为每条记录创建一个唯一的ID。例如,如果今天创建了记录,我希望密钥为20101130XX,其中XX将是01,02,03等数字的连续列表...如果今天有多个人创建记录。

如果3个人昨天创建了记录,那么他们的唯一ID就是

2011032700 2011032701 2011032702

然后午夜来了,有人会创建一个新的记录

2011032800

这样做的目的是为每条记录提供一个唯一的ID,用于引用故障单。

我们已经在使用日期格式,但是目前用户必须手动输入ID,这可能会产生错误,例如2012032700应该是2011032700而不是将2011年放入2012年

我只是不确定如何创建触发器来生成此类唯一ID,并希望获得任何帮助

4 个答案:

答案 0 :(得分:6)

来自dev.mysql.com: example-auto-increment.html

对于 MyISAM和BDB表格,您可以在多列索引中的辅助列上指定 AUTO_INCREMENT 。在这种情况下,AUTO_INCREMENT列的生成值计算为MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。当您想要将数据放入有序组时,这非常有用。

因此,在表上创建2列,一个dateEntered和一个(auto_incremented)id,如下所示:

CREATE TABLE yourTable (
    dateEntered DATE NOT NULL,
    id INT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (dateEntered, id)
) ENGINE=MyISAM;

如果您不使用ISAM而不使用InnoDB,我认为您必须编写自己的触发器来实现此行为。

答案 1 :(得分:2)

这种方法根本不起作用,因为@Charles是真的。您不能依赖时间戳,因为可能存在重复(碰撞)。

创建一个简单的自动增量ID,然后保存时间戳,你会很开心。

答案 2 :(得分:0)

如果每天的参赛人数超过99,你会怎么做?如果您非常想使用“20101130XX”索引,我建议您使用复合键:

CREATE TABLE `test` (
  `date` date NOT NULL,
  `id` tinyint(4) NOT NULL,
  `other_fields` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`date`,`id`)
);

答案 3 :(得分:0)

只需使用microtime()以确保没有重复的条目。

function getUniqueID() {
  $mt = explode(' ', microtime());
  return $mt[1] . substr($mt[0], 2, 7);
  }

P.S。你可以使用7位数以下的低精度。