我有一个使用身份增量功能的主键列的现有表。有没有办法以某种方式更新该列,以便在创建新记录时,自动递增列可以添加另一个数字的前缀?例如,如果创建的下一条记录生成的主键为450016,我希望它的前缀为13,因此保存在数据库中的最终结果为13450016。
答案 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值为带有前缀的指定数字的标识值。我遇到的一个主要问题是我有很多代码引用我的主键列名称,因此通过重命名该问题应该得到解决。谢谢大家!