如何使主键以特定字母开头?
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
的列。
你可以做的是BIGINT
和AUTO_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 执行的外键和唯一性将更加困难和昂贵
【讨论】:
以上是关于如何使主键以特定字母开头?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 aspx 中的 Gridview 行中检索主键以在 userControl.ascx 中使用?
关于MybatisPlus使用@TableId(value = “id“, type = IdType.AUTO)注解使主键id自增长无效的问题