在每月1日重置的唯一自动递增参考编号


Unique auto increment reference number that resets at the 1st of each month

我有一个数据库表,其中包含涉及在船上完成的作业的各种字段,包括使用DATE格式创建的名为的字段。我想要实现的结果是每个工作都有一个唯一的参考号。我想用于这个参考号的格式是:

示例: 假设工作日期是2013年11月23日,就像今天一样。然后这个数字将是1311/1下一个作业1311/2,然后继续。如果月份发生变化,下一个工作的日期是例如2013年12月15日,如果该月的第一个作业是1312/1,我希望有参考号。

因此,我的参考号的前两位数字将显示年份,接下来的两位数字显示月份,斜线后的数字我希望它是一个自动修正号,每个月都会重置。到目前为止,我的代码是:

    $job_num = 1;
foreach($random as $rand) {
    $vak = $rand->created;
    $gas = $rand->id;
    $vak1 = substr($vak, 2, 2);
    $vak2 = substr($vak, 5, -3);
    $vak3 = substr($vak, 8, 10);
    if(date(j) > 1) {
        echo $vak1.$vak2.'/'.$job_num.'<br>';
        $job_num++;
    } else {
        $job_num = 1; 
        echo $vak1.$vak2.'/'.$job_num.'<br>';
        $job_num++;
      }
}

正如你所看到的,我想在foreach语句中实现这一切。尽管上面的代码有点管用,但我的问题是,在任何一个月的第一天,换句话说,当date(j) = 1时,如果我在数据库中插入多个作业,$job_num变量会重置我插入的作业的次数,从而产生相同的引用号。

我对编程和php真的很陌生,所以如果有人能帮我解决这个问题,我会非常感激

提前感谢:)

如果使用InnoDB(MySQL的默认存储引擎),那么使用自动增量机制是无法做到这一点的。

您可以使用MyISAM存储引擎来实现这一点,但出于多种原因,您确实不应该使用MyISAM。

所以你必须自己分配重复的数字。这意味着您必须在检查给定月份的当前最大数字时锁定表,然后插入一个具有下一个更高数字的新行。

如果这看起来会损害对表的并发访问,那么您是对的。请记住,MyISAM在插入/更新/删除任何行期间执行表锁定。

如果您可以使用MyISAM引擎,您可以在没有过程代码的情况下获得此行为。

create table demo (
  yr_mo integer not null,
  id integer auto_increment,
  other_columns char(1) default 'x',
  primary key (yr_mo, id)
) engine=MyISAM;
insert into demo (yr_mo) values (1311);
insert into demo (yr_mo) values (1311);
insert into demo (yr_mo) values (1311);
insert into demo (yr_mo) values (1311);
insert into demo (yr_mo) values (1312);

最后一条INSERT语句开始了新的一个月。

现在,如果您查看MyISAM引擎分配的自动增量值。

select * from demo;
YR_MO  ID   OTHER_COLUMNS
--
1311   1    x
1311   2    x
1311   3    x
1311   4    x
1312   1    x

这是MyISAM记录的行为;查找"MyISAM Notes"。

如果您希望使用yymm/n形式进行演示,请使用类似的格式。

select concat(yr_mo, '/', id) as cat_key
from demo;