Company Name Reference Smiths Joinery smit0001 Smith and Jones Consulting smit0002 Smithsons Carpets smit0003
这些都将存储在MysqL表的varchar列中.数据将被收集,转义和插入,如’HTML – > PHP – > MysqL的”. ID应该是上面描述的格式,四个字母,然后是四个数字(最初至少 – 当我达到smit9999时它将溢出到5个数字).
我可以处理从公司名称生成4个字母,我将直接通过名称,直到我收集了4个字母字符,然后strtolower()它 – 但我需要获得下一个可用的数字.
什么是最好/最简单的方法,以便消除重复的可能性?
目前我在想:
$fourLetters = 'smit'; $query = "SELECT `company_ref` FROM `companies` WHERE `company_ref` LIKE '$fourLetters%' ORDER BY `company_ref` DESC LIMIT 1"; $last = MysqLi_fetch_assoc(MysqLi_query($link,$query)); $newNum = ((int) ltrim(substr($last['company_ref'],4),'0')) + 1; $newRef = $fourLetters.str_pad($newNum,4,'0',STR_PAD_LEFT);
但是,如果两个用户尝试输入同时导致相同ID的公司名称,我可以看到这会导致问题.我将在列上使用唯一索引,因此它不会导致数据库中的重复,但它仍然会导致问题.
当我进行插入时,有没有人能想到让MysqL为我工作的方法,而不是事先在PHP中计算它?
请注意,实际代码将是OO并将处理错误等 – 我只是想知道是否有更好的方法来执行此特定任务,它更多的是关于sql而不是其他任何东西.
编辑
我认为@ EmmanuelN建议使用MysqL触发器可能是解决这个问题的方法,但是:
>我不熟悉MysqL,特别是触发器,以使其工作,并希望创建,添加和使用触发器的分步示例.
>我仍然不确定这是否会消除生成两个相同ID的可能性.看看如果同时插入两行导致触发器同时运行会发生什么,并产生相同的引用?有没有办法以这样的方式锁定触发器(或UDF),它只能有一个并发实例?
CREATE TABLE example ( company_name varchar(100),key_prefix char(4) not null,key_increment int unsigned auto_increment,primary key co_key (key_prefix,key_increment) ) ENGINE=MYISAM;
当您插入表中时,key_increment字段将基于key_prefix的最高值递增.所以插入key_prefix“smit”将以key_inrement中的1开头,key_prefix“jone”将以key_inrement中的1开头,等等.
优点:
>您无需为计算数字做任何事情.
缺点:
>您的密钥分为2列.>它不适用于InnoDB.