如何使主键以特定字母开头?

Posted

技术标签:

【中文标题】如何使主键以特定字母开头?【英文标题】:How to make a primary key start with a specific letter? 【发布时间】:2014-11-03 23:28:55 【问题描述】:

这里我使用的是 mysql,我希望我的主键以字母开头,例如 D000。然后每次我输入新记录时,主键都会自动递增,如下所示:

D001 D002 D003.

我该怎么做?

【问题讨论】:

这封信的目的是什么?如果你想要一个自动增量,为什么你需要一个字母? 为什么?主键 - pk 不应满足其他要求 当您必须在该表中插入第 1001 条记录时会发生什么? 也许您可以使用复合主键? ***.com/q/1110349/1689695 @CocoNess 这样自增没用 【参考方案1】:

您不能AUTO_INCREMENT 类型为VARCHAR 的列。

你可以做的是BIGINTAUTO_INCREMENT,当你需要它作为String时,你可以在你的字母'D'前面加上:

Long dbKey = ...;
String key = "D" + dbKey;

您可以为此创建一个存储过程,将“自动递增”字符串设置为该列的默认值,但这并不值得麻烦。此外,处理数字总是比处理字符串更快、更高效。

【讨论】:

【参考方案2】:

我不确定我的问题是否正确,但以下是否应该有效?

CREATE TRIGGER myTrigger
  BEFORE INSERT
  ON myTable
  FOR EACH ROW
BEGIN
  SET NEW.myCustomId = COALESCE('D', RPAD('0',3,NEW.id)); 
END

对于这种情况,您需要一个“普通”主键列..

【讨论】:

【参考方案3】:

两个想法。

(恕我直言无用)我认为 Maria DB 有 虚拟列,但我认为 MySQL 没有。但是你有视图。因此,您可以创建一个普通的 INT、AUTOINCREMENT 并在视图中有一个计算列连接您的键。

一个人可以为不同的表格使用不同的 数字范围

ALTER TABLE debtors   AUTO_INCREMENT=10000;
ALTER TABLE creditors AUTO_INCREMENT=30000;
ALTER TABLE guests    AUTO_INCREMENT=50000;

诚然,这是一个蹩脚的解决方案,但也许可以。 我认为这样的区别可能是您的目标。

【讨论】:

【参考方案4】:

不确定为什么需要它,但您可以在获取数据后添加 D (String id = "D" + autoIncId;)。

您不能在自动增量字段中插入字符串或任何内容,而且我看不出这有什么用(所有记录器都会有一个 D,所以没有人有)。

如果要声明行默认值,可以添加一个名为DEFAULT 的布尔列。

while(rs.next())
    String id = rs.getBoolean("DEFAULT")?"D":"ND";
    id+=rs.getLong(1);

编辑

根据您的评论,我了解您想要选择最大 ID 并将其加 1。那么在你的数据库中使用自增字段就可以了,它必须是数字类型(INTEGER、BIGINT...)。

请忘记将“D”添加到您的主键中,它根本无法按您的意愿工作。自动增量采用最后插入的 ID 并将其加 1。如果您的最后一个 id 是“D3”,则添加 1 与向“apple”添加 4 的含义相同。您正在使用不同的类型。

SQL 或任何其他编程语言无法理解,如果将“D3”加 1,则它应该变为“D4”。你需要做的是摆脱那个 D(我仍然不明白它的目的)。

【讨论】:

这里我在查询 id=D1,D2,D3 中写,从测试中选择 max(id) 作为 id,id=id+1,那么它应该给出 id=D4 的结果。 D1,D2,D3 是记录。(可能是 D1+1) 您不能将字符串添加到 int。 “D1”是一个字符串(DB 中的 VARCHAR),你不能给它加 1。您应该从数据库中删除 te D 并将它们添加到 java 中。【参考方案5】:

你可能会尝试做这种失常,风险自负:

INSERT INTO table (id, a, b, c) 
      VALUES ( fn_get_key( LAST_INSERT_ID("table_name ") +1), "a", "b", "c");

其中 fn_get_key 是将数字转换为所需字符串并执行的函数:

ALTER TABLE table_name AUTO_INCREMENT = start_value;

无论如何我不推荐你的方法。数字字符串更快更容易排序。您始终可以创建一个转换 ID 的视图或使用逻辑从“D001”键更改为“1”。 ids 执行的外键和唯一性将更加困难和昂贵

【讨论】:

以上是关于如何使主键以特定字母开头?的主要内容,如果未能解决你的问题,请参考以下文章

如何使主键作为房间持久性库的自动增量

设计 mySql 索引和主键以提高效率

如何从 aspx 中的 Gridview 行中检索主键以在 userControl.ascx 中使用?

如何首先在实体框架代码中设置身份主键的起始值?

关于MybatisPlus使用@TableId(value = “id“, type = IdType.AUTO)注解使主键id自增长无效的问题

从插入的 DataSet 中获取主键以链接到其他插入