【问题标题】:Unique code based on districts基于地区的唯一代码
【发布时间】:2015-10-28 16:37:10
【问题描述】:

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

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,然后将其添加回来,并附加 District_code。

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

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

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

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    使用带有城镇前缀的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,如果有新用户注册,则将其加一。这些表可以通过 JOIN 连接(在 town_code 上)。

    【讨论】:

    • 这会创建一个唯一标识符,但实际上需要不同,以根据来自同一地区的先前代码增加 user_code。一种具有多个前缀的自动增量
    • 哇......这看起来很简单!
    • @VijayaSankarN:简单的解决方案往往是最好的:-)
    • 绝对!如果这工作完美,让我标记接受!处理这个问题,检查是否有解决方法来减少对 DB 的请求数。
    • 糟糕!同样的问题,两个人获取 current_max,两者都加一并再次发生冲突!
    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2016-12-05
    • 2017-05-23
    • 2016-02-20
    相关资源
    最近更新 更多