首先,我很抱歉如果之前已经问过这个问题 - 事实上我确定它已经存在了,但是我找不到它/无法计算出搜索以找到它。如何根据MySQL中的现有值获取下一个字母数字ID
我需要根据公司名称生成唯一的快速参考ID。因此,例如:
Company Name Reference Smiths Joinery smit0001 Smith and Jones Consulting smit0002 Smithsons Carpets smit0003
这些都将被存储在一个MySQL表中的VARCHAR列。数据将被收集,转义并插入,如'HTML - > PHP - > MySQL'。身份证的格式应该是上面描述的格式,四个字母,然后是四个数字(最初至少 - 当我到达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中计算它?
需要注意的是实际的代码将面向对象和将处理错误等等 - 我只是在寻找是否有更好的方法来做到这一点特定任务的想法,它是更多关于SQL比什么都重要。
编辑
我觉得@使用MySQL的触发器的EmmanuelN的建议可能是处理这个问题的方法,但是:
- 我不够好与MySQL,尤其触发器,以让它起作用,并且想要创建,添加和使用触发器的分步示例。
- 我还不确定这是否会消除生成两个相同ID的可能性。请参阅
what happens if two rows are inserted at the same time that result in the trigger running simultaneously, and produce the same reference? Is there any way to lock the trigger (or a UDF) in such a way that it can only have one concurrent instance?
。
不然我就开放给任何其他建议的方法解决这个问题。
您是否想过在触发器中使用触发器并生成该ID? –
不,但是SQL绝对是我在这类项目中最弱的话题,我真的不知道如何有效地使用触发器 - 你能否给我一个基本的如何做到这一点?如果你能指点我一些相关阅读材料的方向,我会很高兴:-) – DaveRandom
[本文](http://www.sugarcrm.com/forums/f6/developed-auto-generate-ids-guids -within-mysql-2895 /)讲述了在使用mysql的GUID上自动生成,我认为它会给你开始的地方 –