【问题标题】:Force auto_increment to skip certain values?强制 auto_increment 跳过某些值?
【发布时间】:2013-03-19 15:34:36
【问题描述】:

作为我当前项目的一部分,URL 可能如下所示:

http://example.com/summary/ab123

最后一部分是通过自定义字母表有效地运行 base_convert(~,10,64) 后的整数 ID。

但是,字母拼写事物。例如,当 ID 1,950,434 出现时,URL 将是:

http://example.com/summary/shit

所以...是的。有什么方法可以“保留”构成不良词的 ID 并使 AUTO_INCREMENT 字段跳过它们?

【问题讨论】:

  • 如果您仅仅因为示例 URL 而投票赞成这个问题,请投票赞成这个评论:p
  • 其实我真的觉得这是个好问题......
  • 你是base64编码only来降低ID的长度吗?如果没有,你可能做错了什么。
  • 为什么不在 URL 中使用数字形式的 ID?

标签: mysql auto-increment


【解决方案1】:

虽然您可以通过创建一个触发器来检查自动生成的 ID,并且如果该 ID 包含在您的排除列表中,但您可以在数据库中实现某些内容 - 删除该行并重试。

但是,这对我来说似乎有点 hacky... 并且让数据库关心应该超出其范围的东西 - 转换为脏字的 ID。

相反,我会建议一个完全在数据库之外的解决方案。例如,您可以更改自定义字母表以排除所有元音吗?这样,无论生成的 ID 是什么,它都不会在您的 URL 中拼出任何令人讨厌的东西。

我能想到很多你不想在你的 URL 中出现的词。如果您尝试将不需要的单词列入黑名单,我会说一个更奇特的术语会漏掉的可能性很大......所以我认为不需要黑名单的方法也是出于这个原因的理想选择。

【讨论】:

  • 这是个好主意。我将立即实施。非常感谢!
  • “例如,您可以更改自定义字母表以排除所有元音吗?这样一来,无论生成的 ID 是什么,它都不会在您的 URL 中拼出任何令人讨厌的东西。” RTFM、MTHRFCKR、CKCSCKR、... :-)
  • @CBroe 公平点,但删除元音会阻止从字面上拼出它们,也大大减少了选项的数量。作为奖励,这意味着我可以拥有一个 ID 别名包含元音来拼写特定单词的“新奇事物”。
【解决方案2】:

这样做的唯一方法可能是确定最后一个 ID 是什么(使用 LAST_INSERT_ID)。然后确定下一个数字是否是不受欢迎的数字,插入垫片,然后立即删除该条目。

【讨论】:

    猜你喜欢
    • 2020-03-21
    • 2021-03-14
    • 1970-01-01
    • 2020-05-01
    • 2016-05-02
    • 1970-01-01
    • 2018-05-25
    • 2020-12-08
    • 2017-07-20
    相关资源
    最近更新 更多