唯一的自动增量参考编号,在每个月的第1天重置

时间:2013-11-22 22:59:13

标签: php mysql

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

示例: 让我们说这份工作的日期是今天23/11/2013。那么下一个工作1311/2的数字是1311/1并继续。如果月份发生变化并且下一个工作的日期是例如2013年12月15日,那么如果当月的第一份工作是1312/1,那么我希望得到的refence号码。

所以我的参考编号的两个第一个数字将显示年份,接下来的两个月和斜杠后面的数字我希望它是一个auto_increment数字,它将在每个月重置。到目前为止,我的代码是:< / p>

    $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 语句中实现所有这些。虽然上面的代码有点工作,但我所拥有的问题是在任何月份的第1天换句话说date(j) = 1如果我在我的数据库中插入多个作业,$job_num变量会重置多次因为我插入的工作导致相同的反射数字。

我是编程和php的新手,所以如果有人能帮我解决这个问题,我会非常感激。

提前致谢:)

2 个答案:

答案 0 :(得分:1)

如果您使用InnoDB(MySQL的默认存储引擎),则无法使用自动增量机制执行此操作。

您可以使用MyISAM存储引擎,但really shouldn't use MyISAM, for many reasons

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

如果这似乎会影响对表的并发访问,那么你是对的。请记住,在插入/更新/删除任何行期间,MyISAM会执行表锁定。

答案 1 :(得分:0)

如果您可以使用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's documented behavior;寻找“MyISAM Notes”。

如果你想要表格yymm / n进行演示,请使用类似的东西。

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