【问题标题】:Autoincrement of table id using string combination in database automatically使用数据库中的字符串组合自动增加表ID
【发布时间】:2010-07-14 10:57:58
【问题描述】:

我们知道任何表的 id 都是整数类型,并且在该表中自动递增是可以的。但我的问题是我想增加字符串和整数的组合。例如 String : ABC是唯一id的起始码。

我的表的第一个 ID 应该是主键和

即ABC10001、ABC10002、.....等等。

不使用另一个键作为自动增量。请不要使用两种唯一键。

【问题讨论】:

  • 为什么主键需要前缀?查询或显示时不能在应用层添加吗?
  • 这看起来与这个问题非常相似:How to add a series of string in incrementing id in any table? 据我所知,MySQL 中的自动递增字母数字键是不可能的。您必须编写自己的序列生成器,也许在触发器中。但这似乎是一个疯狂的解决方案!
  • 主键本身就是一个唯一键,但我什至希望以字符串的形式跟踪唯一键。假设一个员工表包含一个员工的记录,从 1 开始,但我想从 EMP-0001 开始,像这样......让它再次唯一和可读。

标签: mysql database


【解决方案1】:

您不能在一列中执行此操作,除非您指定一个 BEFORE INSERT 触发器来预填充它,这完全取决于您来避免 auto_increment 自行处理的任何类型的竞争条件。 auto_increment 只能用于整数或浮点列。

在我看来,“要求”具有特定格式的 PK 和“让它自动递增”是相互排斥的。

这并不意味着您不能在选择时“伪造”它:

SELECT CONCAT('ABC1',LPAD(id,5,'0')) FROM tablename;

【讨论】:

  • 你节省了我的时间。非常感谢
【解决方案2】:

实施这个是个坏主意。您将不得不手动计算下一个值,然后您将受到竞争条件的影响。这可能会导致严重的数据完整性问题,如果您没有完全正确地解决这些问题,则这些问题是无法解决的。但是,如果您只想显示带有客户名称的数字,这是可能的,但对于客户而言,数字将不按顺序排列。 (我以客户端为例,我真的不知道你的前缀是什么意思),所以如果 ABC001、DEF002、ABC003 是可以接受的,那么只需连接起来从你的自动真实 id 中获取数字。

【讨论】:

    【解决方案3】:

    除了 Wrikken 的响应之外,您还可以从 db 中选择“下一个”值:

    SELECT LPAD( max( substr( id, 5 ) ) +1, 4, '0' ) FROM tablename
    

    然后在你的下一个插入语句中使用这个值。

    【讨论】:

    • 这不是一个可接受的解决方案“原样”,需要更多来防止竞争条件。
    猜你喜欢
    • 2015-07-18
    • 2015-12-31
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2013-07-06
    相关资源
    最近更新 更多