使用string的唯一int(11)mysql值

时间:2013-08-27 04:01:32

标签: php mysql

我的数据库中有一个int(11)的列,有时我无法将用户名与id数据库匹配,因为名称略有不同(即John Doe而不是Johnathan Doe)。普通ID从11000范围开始,所以我想将它们的名称转换为整数并添加00或其他东西,这样我就可以触发一个标记供某人查看和更新​​。我知道我可以使用str_pad来获得00,但我似乎无法生成一定数量的数字,这些数字与名称有些不同。我知道重复的可能性很高,但我不知道我还能用primary/unique列做什么。任何帮助将不胜感激。

使用mt_randstr_pad的示例:

str_pad(mt_rand(100000000,999999999),11,'00',STR_PAD_LEFT);

任何人都有更好的选择,可能会使用名称字符串吗?

1 个答案:

答案 0 :(得分:1)

  

我的数据库中有一个int(11)

该列是一个整数。在存储级别,“11”并不意味着什么。

想象一下,你有一个庞大的用户名表,有人试图第40次输入'John Smith'。你想让我做什么?您是否希望有人将其与所有其他变体进行比较?你想识别和复习变体拼写,比如'Johnathan','Jonathon','John'和'Jhon'?重大决策,但它们不会影响如何处理需要审核的ID号。

要识别需要审核的行,无论出于何种原因,最好将其密钥放入另一个表中。

create table review_sets (
  set_id integer not null,
  set_created timestamp not null default now(),
  rationale varchar(100) not null default 'Duplicate of existing user?',
  primary key (set_id),
  unique (set_created)
);

create table review_ids (
  set_id integer not null,
  user_id integer not null,
  primary key (set_id, user_id),
  foreign key (set_id) references review_sets (set_id),
  foreign key (user_id) references users (user_id)         -- Not shown.
);

列review_sets.rationale允许您使用区分拼写问题,例如延迟付款或网站滥用。 review_ids表允许您将ID限制为一些变体,而不是所有可能的变体。 (但我不确定它可能有多大用处。)

您可能希望添加标识审阅者的列,审核完成的时间以及审阅者达成的决策。根据您的应用程序,您可能只需在做出决定后删除行。