Sql server 如何使用数字作为自动递增列的前缀
我有一个现有的表,它有一个使用identity increment特性的主键列。是否有任何方法可以以某种方式更新该列,以便在创建新记录时,自动递增的列可以以另一个数字作为前缀?例如,如果创建的下一条记录生成一个主键450016,我希望它有一个前缀13,这样保存在db中的最终结果是13450016。“我想我希望找到一种方法来实际操作标识列,而不是创建一个新的计算列。” 标识栏相当顽固。如果你想做这样的事情,最好的办法是,我想把所有的东西都复制到一个新的表中。如果你想用13作为前缀,你真正要做的就是把13000000加到所有存在的符号上,然后从那里开始计算Sql server 如何使用数字作为自动递增列的前缀,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个现有的表,它有一个使用identity increment特性的主键列。是否有任何方法可以以某种方式更新该列,以便在创建新记录时,自动递增的列可以以另一个数字作为前缀?例如,如果创建的下一条记录生成一个主键450016,我希望它有一个前缀13,这样保存在db中的最终结果是13450016。“我想我希望找到一种方法来实际操作标识列,而不是创建一个新的计算列。” 标识栏相当顽固。如果你想做这样的事情,最好的办法是,我想把所有的东西都复制到一个新的表中。如果你想用13作为前缀,你真正要做的就是
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
如果可以多次执行此操作,但决不能倒退,则前缀必须始终增加种子值。可能有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
按原样使用代码,但将_ID_列的NAME_替换为我们正在处理的实际列名,并将TABLE_NAME替换为该列所在的表的名称
如果NSEQ列生成的值为0,则表示尚未删除,如果为1,则表示已删除
如果您愿意,请在评论中告诉我答案,我将对相关代码进行排序。我不能只是重新设定它的种子,因为它需要始终以相同的数字作为前缀。我要做的是混合一些建议。我要做的是重命名我的主键列,创建一个新列,并将其命名为我以前的主键列的名称,然后添加一个触发器,该触发器将更新我的新列的值,使其与前缀为指定数字的标识值一致。我遇到的一个主要问题是,我有很多代码引用我的主键列名,所以通过重命名,这个问题应该得到解决。谢谢大家 为什么要这样做?这里讨论的是您的选项您需要在标识值的最后两位加前缀还是可以加前缀?抱歉,编辑我的示例以消除混淆。只需要在标识值前面加上我想要的任何1或2位数字。@BoratSagdiyev,我想知道这是因为我们有多个数据库包含相同类型的数据,但pk只对其自己的数据库唯一。但现在我们需要它们在所有db服务器中都是唯一的。此列是一个大的int字段,因此我们无法切换到使用guid。