【发布时间】:2011-11-05 15:15:06
【问题描述】:
首先,如果之前有人问过这个问题,我深表歉意 - 我确定确实有,但我找不到/不知道要搜索什么才能找到它。
我需要根据公司名称生成唯一的快速参考 ID。比如:
公司名称参考 史密斯细木工 smit0001 史密斯和琼斯咨询公司 smit0002 史密森地毯 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 的可能性。见
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 绝对是我最薄弱的科目,我真的不知道如何有效地使用触发器 - 你能给我一个基本的介绍吗?完毕?如果你能指出一些相关阅读材料的方向,我会很高兴:-)
-
This article 谈到了使用 mysql 在 GUID 上自动生成,我认为它会给你一个开始的地方
-
谢谢,我会玩一玩,看看我能想出什么
-
这似乎会减少生成重复的可能性(通过更快),但不能完全消除它 - 如果同时插入两行导致触发器同时运行会发生什么,并产生相同的参考?有没有办法以只能有一个并发实例的方式锁定触发器(或 UDF)?还是有其他方法来解决这个问题?