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

Java 如何使主键以特定字母开头?,java,mysql,swing,Java,Mysql,Swing,这里我使用的是MySQL,我希望我的主键以字母开头,比如D000。然后每次输入新记录时,主键自动递增,如下所示: D001 D002 D003 我该怎么做?您不能自动递增类型为VARCHAR的列 您可以做的是使其成为BIGINT和AUTO_INCREMENT,当您需要它作为String时,您可以用字母'D'将其作为前缀,如下所示: Long dbKey = ...; String key = "D" + dbKey; 您可以为此创建一个存储过程,将“自动递增”字符串设置为该列的默认值,但这并不

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

D001 D002 D003


我该怎么做?

您不能
自动递增
类型为
VARCHAR
的列

您可以做的是使其成为
BIGINT
AUTO_INCREMENT
,当您需要它作为
String
时,您可以用字母
'D'
将其作为前缀,如下所示:

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

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

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

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

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

while(rs.next()){
    String id = rs.getBoolean("DEFAULT")?"D":"ND";
    id+=rs.getLong(1);
}
编辑 根据您的评论,我理解您希望选择max ID并向其中添加1。然后可以在数据库中使用自动增量字段,它必须是数字类型(INTEGER、BIGINT…)

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


SQL或任何其他编程语言都无法理解,如果将1添加到“D3”中,它将变成“D4”。你需要做的是去掉这个D(我仍然不明白这个目的)。

我不确定我是否正确回答了你的问题,但下面的方法是否应该奏效

CREATE TRIGGER myTrigger
  BEFORE INSERT
  ON myTable
  FOR EACH ROW
BEGIN
  SET NEW.myCustomId = COALESCE('D', RPAD('0',3,NEW.id)); 
END
对于这种情况,您需要一个“普通”主键列

两个想法

  • (无用的IMHO)我认为Maria DB有虚拟列,但我认为MySQL没有。但你有自己的观点。因此,您可以创建一个正常的INT、AUTOINCREMENT,并且在视图中有一个与键相关的计算列

  • 可以对不同的表使用不同的数字范围

    ALTER TABLE debtors   AUTO_INCREMENT=10000;
    ALTER TABLE creditors AUTO_INCREMENT=30000;
    ALTER TABLE guests    AUTO_INCREMENT=50000;
    
    诚然,这是一个站不住脚的解决方案,但或许可以。我认为这样的区别可能是你的目标


您可能会尝试这样做,风险由您自己承担:

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的外键和唯一性将更加困难和昂贵

这封信的目的是什么?如果你想要一个自动递增,为什么在它之前需要一个字母?为什么?主键-pk不应与其他要求混合。当您必须在该表中插入第1001条记录时,会发生什么情况?也许您可以使用复合主键@CocoNess在这种情况下,自动增量是可用的。当我在查询id=D1,D2,D3中写入时,从test中选择max(id)作为id,id=id+1,然后它应该给出id=D4的结果。D1、D2、D3是记录。(是否可能是D1+1)不能向int添加字符串。“D1”是字符串(DB中的VARCHAR),不能向其添加1。您应该从DB中删除te D,并在java中添加它们。