我有一个数据库表,其中包含涉及在船上完成的作业的各种字段,包括使用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的新手,所以如果有人能帮我解决这个问题,我会非常感激。
提前致谢:)
答案 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;