在mysql id上添加日期前缀

时间:2014-09-24 16:15:16

标签: php mysql sql auto-increment prefix

我有一个ID字段,我希望它具有以下格式: YYMMDDXXXXXXXX,其中YY是年份,MM是月份,DD是当天,XXXXXXXX是带有前导零的实际ID号。当日期更改时,ID号码应重置为0。

首先,对于ID字段而言,这是一个不太好的做法/格式,它也将成为主键吗?

实现:

我将数据插入我的数据库扔了php,我想出了两种方法来实现上述格式。

  • 使用php insert查询手动插入(没有AUTO_INCREMENT 字段),我选择MAX(id),拆分它(date-id),检查当天是否有 更改,然后只需将其递增1或替换为 newdate + 0。这种方式的问题是我必须多做一些 选择并检查/更改字符串,如果我有超过20,则SELECT可以返回相同的MAX(id) 请求/秒以及date('Ymd')导致apache崩溃 超过60个请求/秒。
  • 在ID字段上添加AUTO_INCREMENT并设置AUTO_INCREMENT YYMMDD00000000当天改变,然后让auto_increment 做好这份工作。我试过ALTER TABLE foo AUTO_INCREMENT=(SELECT CURDATE()*100000000),但正如我所期望的那样CURDATE()不能 像这样使用。

感谢你的时间,我的尝试的任何想法和/或帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

理智的方式:

  1. 告诉你的团队经理这个设计有很大的缺陷。
  2. 改为呈现以下架构:

    CREATE TABLE foo (
      id INTEGER AUTO_INCREMENT,
      date DATETIME DEFAULT=NOW(),
      PRIMARY KEY (id),
      INDEX (date)
    );
    
  3. 如有必要,可以使用查询生成类似样式的ID:

    SELECT CAST(DATE_FORMAT(date,'%Y%m%d') AS UNSIGNED)*100000000 + id AS 'weird_id'
    

    如果您的ID成为>这将会失控。 10,000,000,虽然我的测试显示使用BIGINT这个sheme应该能够处理一个或两个以上的零。您还可以通过选择此ID作为字符串来解决整数类型限制,例如:

    SELECT CONCAT(DATE_FORMAT(date, '%Y%m%d'), LPAD(id,10,'0')) AS 'weird_id'
    

    10中的LPAD()可以是您想要的任意数字。

  4. 不理智,面子,未来噩梦的方式:

    你几乎拥有它。 CURDATE()返回一个字符串,ALTER TABLE foo AUTO_INCREMENT=需要一个整数,只有一个整数。没有函数,变量等。以下将起作用:

    击:

    mysql -u root -e "ALTER TABLE dbname.foo AUTO_INCREMENT = $(date +%Y%m%d0000000000);"
    

    PHP:

    $query = sprintf("ALTER TABLE dbname.foo AUTO_INCREMENT = %s;", str_pad(date("Ymd", time()), 18, '0'));
    

    这会破坏:

    • 每当crond hiccups
    • 可能在夏令时间变化期间
    • 随机且无明显原因
    • 9999年12月31日午夜之后

    请自己,以及从您那里继承此项目的人,帮助并在此表中保留单独的DATETIME列,以便将来仍可从中收集有意义的,未破坏的信息。