基于地区的唯一代码

时间:2015-10-28 05:22:23

标签: php mysql

我必须为每个注册的用户创建一个唯一的代码。问题是需要根据用户所在的城市生成唯一代码。 所以我的表格是:

CREATE TABLE `microreg`.`users` ( `user_id` INT NOT NULL
AUTO_INCREMENT , `user_code` CHAR(10) NOT NULL , PRIMARY KEY (`user_id`),
UNIQUE (`user_code`));

user_id用于DB中用户的唯一标识  user_code是    为用户使用而生成的可读代码。他们访问他们的    帐户使用该唯一代码。

CREATE TABLE `microreg`.`districts` ( `district_id` INT NOT NULL
AUTO_INCREMENT , `district_name` VARCHAR(50) NOT NULL , `district_code`
CHAR(4) NOT NULL , PRIMARY KEY (`district_id`), UNIQUE (`district_code`));`

这包含大约20K区,分配了唯一代码。

说,

Trichy      ITRY
Coimbatore  ICBE
Kolkata     IKOL
Delhi       IDEL
...
New York    UNYK
Washington  UWDC

因此,当用户向Trichy注册为区域时,他将使用

生成
user_id   : 1
user_code : ITRY000001

来自同一城市的第二位用户

user_id   : 2
user_code : ITRY000002
另一个来自纽约的人

user_id   : 3
user_code : UNYK000001

user_code在区域方面是唯一的。 [id为1和3的用户不相同]

到目前为止,我获取了用户所选区域的最大值

SELECT RIGHT(MAX(user_code),6) FROM `users` WHERE user_code LIKE 'ITRY%';

然后将其递增1,然后将其添加回添加了zone_code。

INSERT INTO `microreg`.`users` (`user_id`, `user_code`) VALUES (NULL, 'ITRY000003');

当一次只有一个用户更新时,此方法可以正常工作。但是当多个用户同时开始注册时,这开始产生问题。 由于设置了唯一,因此生成了具有相同user_code的两个用户并产生开销。

以前,对于另一个应用程序,我为每个代码创建了唯一的表(比如这里的分区),并将用户添加到该表中,然后附加回原始表(如此处的用户)。 在那种情况下,我只有4种类型的代码(比如这里的分区)。但对于这个应用程序,我有大约20K区。我无法为此获得火花。 (有关信息,我将PHP与mysqli一起用于此应用程序)谢谢。

1 个答案:

答案 0 :(得分:0)

如何使用带有该城镇前缀的uniqid()呢?像这样:

 $user_code = uniqid('UNYK', true); // with more entropy that is

请注意,这不是100%独特且有些可预测的(我猜不是出于“正常”目的)。

或者(根据您的评论),您可以设置一个包含三列的新表格(例如towntoid或者......)

Town        town_code  current_max
----------|-----------|-----------
Trichy      ITRY        10
Coimbatore  ICBE        124
Kolkata     IKOL        213
Delhi       IDEL        0
...
New York    UNYK        21

从那里获取current_max并在新用户注册时将其递增1。这些表可以通过JOIN连接(在town_code上)。