【发布时间】: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