【问题标题】:Unique int(11) mysql value using string使用字符串的唯一 int(11) mysql 值
【发布时间】:2013-08-27 04:01:32
【问题描述】:

我的数据库中有一个列是 int(11),有时我无法将用户名与 ids 数据库匹配,因为名称略有不同(即 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);

谁有更好的选择,可能使用名称字符串?

【问题讨论】:

  • 这将如何帮助将用户名与 id 数据库匹配?如果名称不同,则 id 可能会不同。
  • 您到底想要做什么?获取给定字符串名称的用户ID?如果是这样,那么您将遇到@Jack 提到的问题。您是否在问如何将字符串值插入到具有保证唯一 ID 的 MySQL 表中?最好使用 auto_increment 列来完成。还是完全是另外一回事?
  • 我认为这很清楚。正常的 id 是 11000 我想做类似 01234467891 的东西,它将插入到代理名称有点独特的 int(11) 中。这将允许我找到以 0 开头的所有 id 并进行人工审查以修复
  • 为什么不添加一个列,例如枚举NeedsCheck,其值为Yes / No
  • 这是一个我没有想到的选项,但从stackoverflow.com/a/362058/1626329 来看,我想远离枚举。不过谢谢!

标签: php mysql


【解决方案1】:

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

该列是一个整数。在存储层面,“11”并不代表什么。

假设您有一个很大的用户名表,并且有人第 40 次尝试输入“John Smith”。你想让我做什么?您是否希望有人将其与 all 其他变体进行比较?您想识别和查看变体拼写,例如“Johnathan”、“Jonathon”、“John”和“Jhon”吗?重大决策,但不会影响如何处理需要审查的身份证号码。

要确定需要审查的行,无论出于何种原因,最好将它们的键放入另一个表中。

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 限制为几个变体,而不是所有可能的变体。 (但我不确定这有多大用处。)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多