如何使用数字为自动递增列添加前缀

时间:2014-04-26 16:59:13

标签: sql-server sql-server-2008

我有一个使用身份增量功能的主键列的现有表。有没有办法以某种方式更新该列,以便在创建新记录时,自动递增列可以添加另一个数字的前缀?例如,如果创建的下一条记录生成的主键为450016,我希望它的前缀为13,因此保存在数据库中的最终结果为13450016。

3 个答案:

答案 0 :(得分:1)

“我想我希望找到一种方法来实际操作标识列,而不必创建新的计算列。”

标识栏非常顽固。你最好打赌,如果你想做这样的事情,我想把所有东西都复制到一张新桌子上。如果你想用13加前缀你正在做的是向每个存在的东西添加13000000并从那里算起来。

CREATE TABLE tbl (ID INT IDENTITY,Val INT)
INSERT INTO tbl VALUES (1),(1)

SELECT * FROM tbl

CREATE TABLE tbl2 (ID INT IDENTITY,Val INT)

SET IDENTITY_INSERT tbl2 ON

INSERT INTO tbl2 (ID,val)
      SELECT ID+1300000, Val
        FROM tbl WITH (HOLDLOCK TABLOCKX)

SET IDENTITY_INSERT tbl2 OFF

DROP TABLE tbl

EXECUTE sp_rename N'tbl2', N'tbl', 'OBJECT'  

SELECT * FROM tbl

INSERT INTO tbl VALUES (1),(1)
SELECT * FROM tbl

DROP TABLE tbl

如果您只是想重新设置身份以使所有内容保持原样并且在13xxxxxx处拥有下一个记录星,那么您可以重新设置:

CREATE TABLE tbl (ID INT IDENTITY,Val INT)
INSERT INTO tbl VALUES (1),(1)

SELECT * FROM tbl

DBCC CHECKIDENT ('tbl', RESEED, 1300002);

INSERT INTO tbl VALUES (1),(1)
SELECT * FROM tbl

DROP TABLE tbl

如果您可以多次执行此操作,但您永远不能倒退,那么您的前缀必须始终增加种子值。

答案 1 :(得分:0)

可能有4种方式:

(1)其他表不引用此主键,并且您没有删除行(数字是顺序的)。 (2)其他表不引用此主键,但数字不是顺序的(行已被删除)。 (3)数字是顺序的,但其他表引用此主键。 (4)有引用和删除的行。

通过上述任何方式,都可以更换色谱柱。

尝试在桌面上运行这些chex:

EXEC sp_fkeys 'tablename'

按原样使用代码,但将tablename替换为表的名称(确保您在正确的数据库中并保留单引号)。

如果此存储过程显示任何行,我们需要暂时删除外键约束;请参阅列FK_Name并列出此列中的任何值。如果它产生任何行,请告诉我。

然后运行以下代码:

SELECT TOP 1 NAME_OF_ID_COLUMN - ROW_NUMBER()OVER(ORDER BY ID) AS NSEQ
FROM TABLE_NAME ORDER BY NSEQ DESC

按原样使用代码,但将NAME_OF_ID_COLUMN替换为我们正在处理的实际列名,并将TABLE_NAME替换为该列所在表的名称。

如果NSEQ列的值为0,则表示您没有删除,如果为1,则表示您已删除。

如果您愿意,请在评论中告诉我答案,我会对相关代码进行排序。

答案 2 :(得分:0)

我无法重新设置它,因为它需要始终以相同的数字作为前缀。我要做的只是提供一些建议的混合物。我要做的是重命名我的主键列,创建一个新列并将其命名为我以前的主键列的名称,然后添加一个触发器来更新我的新列&#39 ; s值为带有前缀的指定数字的标识值。我遇到的一个主要问题是我有很多代码引用我的主键列名称,因此通过重命名该问题应该得到解决。谢谢大家!