【问题标题】:How do I auto-increment a alphanumeric string primary key?如何自动递增字母数字字符串主键?
【发布时间】:2022-11-15 11:06:22
【问题描述】:

假设有表 A。表 A 有一个字母数字字符串主键。用于创建表格的代码以及表格的外观如下所示。

CREATE TABLE A (
   ID CHAR(7) NOT NULL,
   ...
   CONSTRAINT PK_A PRIMARY KEY (ID)
)
| ID       | ...      |
| -------- | -------- |
| C000001  | ...      |
| C000002  | ...      |

我想在表 A 中插入一个新行,我不想每次都输入 C000003 或 C000004。有没有办法自动增加这个?

我考虑过使用select top 1 CustId from Customer order by CustId desc 获取最新的 id。对于拆分,我使用了SUBSTRING(ID, 2, 7)。要重新加入,我可以使用concat('C', ID + 1)

问题是,如果我在数字部分加一,它会给我 3 而不是 000003。有没有办法保存 0?

我只需要增加帮助。

我当前的代码是这样的:

declare @lastid varchar(7), @newID varchar(7)
set @lastid = (select top 1 ID from A order by ID desc)
set @newID = SUBSTRING(@lastid, 2, 7)
select CONCAT('C', @newID + 1) -- need help with the incrementation

任何帮助表示赞赏

编辑 1:如果数字少于 10(即一个数字),我可以手动添加 0 来填补空白。但是如果数字有 2 位数或更多,我不能这样做,所以我正在考虑解决这个问题的方法。

【问题讨论】:

  • 如果您想自动递增,我认为您最好使用数字键并在其他地方生成您的字母数字 ID。例如myID = 'C' + RIGHT('000000' + CONVERT(VARCHAR(6), ID), 6) 在任何您想查看字母数字 ID 的地方。
  • 你好,谢谢你的建议。我对我的问题进行了新的编辑,但我会在这里说出来。如果数字是 1 位数,您的解决方案将有效。但如果该数字有 2 位或更多位,则会违反该列的 CHAR(7) 约束。
  • 可以? 'C' + RIGHT(..., 6) == 1 + 6 == 7。当您点击 ID 1000001(100 万和 1)时,您可能会违反约束条件,因为它会截断最重要的数字.
  • 忽略我之前的评论@ZLK。我有一些错别字,现在可以了。非常感谢!

标签: sql sql-server


【解决方案1】:

我认为这不是自动增量更改 char 值的任何建议方法。按照逻辑我们可以做到。以下是有效实现此目的的完美方法。

假设您有一个名为 stminternal 的表,其中包含以下列 代码, 字首, 数字, 最后没有

Insert into stminternal values(1,'C',6,0)

所以使用这个表你可以生成新的字符串。 第一次 当记录插入 C000001。

UPDATE stminternal SET LASTNO=2 WHERE CODE=1

这样它可以像魅力一样工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 2014-10-08
    • 2011-09-25
    • 2012-10-31
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多