我有SQL Server数据库,我想改变标识列,因为它开始了 有一个大数字10010,它与另一个表相关,现在我有200条记录,我想在记录增加之前修复这个问题。
更改或重置该列的最佳方法是什么?
我有SQL Server数据库,我想改变标识列,因为它开始了 有一个大数字10010,它与另一个表相关,现在我有200条记录,我想在记录增加之前修复这个问题。
更改或重置该列的最佳方法是什么?
当前回答
这发生在我身上,因为我做了一个合并,它更新了我正在进行合并的ID。
失败的例子(注意ClownID):
MERGE ArchitectMain.dbo.BackendClowns AS TGT
USING (
SELECT ClownID
,ClownName
,Description
,Active
,EmailSubject
,AddedBy
,Added
FROM #temptable1
) AS SRC(ClownID, ClownName, Description, Active, EmailSubject, AddedBy, Added)
ON (TGT.ClownID = SRC.ClownID)
WHEN MATCHED
THEN
UPDATE
SET ClownID = SRC.ClownID
,ClownName = SRC.ClownName
,Description = SRC.Description
,Active = SRC.Active
,EmailSubject = SRC.EmailSubject
,AddedBy = SRC.AddedBy
,Added = SRC.Added;
示例(注意ClownID):
MERGE ArchitectMain.dbo.BackendClowns AS TGT
USING (
SELECT ClownID
,ClownName
,Description
,Active
,EmailSubject
,AddedBy
,Added
FROM #temptable1
) AS SRC(ClownID, ClownName, Description, Active, EmailSubject, AddedBy, Added)
ON (TGT.ClownID = SRC.ClownID)
WHEN MATCHED
THEN
UPDATE
SET ClownName = SRC.ClownName
,Description = SRC.Description
,Active = SRC.Active
,EmailSubject = SRC.EmailSubject
,AddedBy = SRC.AddedBy
,Added = SRC.Added;
其他回答
您还可以使用SET IDENTITY INSERT来允许您将值插入到标识列中。
例子:
SET IDENTITY_INSERT dbo.Tool ON
GO
然后你可以在单位列中插入你需要的值。
我已经解决了这个问题,首先使用DBCC,然后使用插入。例如,如果你的桌子是
首先在表中设置新的当前ID Value为NEW_RESEED_VALUE
MyTable { IDCol, 可乐, colB }
DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE)
然后你可以使用
insert into MyTable (colA, ColB) select colA, colB from MyTable
这将复制所有记录,但使用新的IDCol值作为NEW_RESEED_VALUE开始。然后,在删除/移动外键引用(如果有)后,可以删除ID值较高的重复行。
您不能更新标识列。 SQL Server不允许更新标识列,这与使用更新语句更新其他列不同。
尽管有一些替代方案可以实现类似的需求。
当需要为新记录更新标识列值时
使用DBCC CHECKIDENT检查表的当前标识值,如果需要,则更改标识值。
DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)
当需要更新现有记录的标识列值时
使用IDENTITY_INSERT,它允许显式的值插入到表的标识列中。
SET IDENTITY_INSERT YourTable {ON|OFF}
例子:
-- Set Identity insert on so that value can be inserted into this column
SET IDENTITY_INSERT YourTable ON
GO
-- Insert the record which you want to update with new value in the identity column
INSERT INTO YourTable(IdentityCol, otherCol) VALUES(13,'myValue')
GO
-- Delete the old row of which you have inserted a copy (above) (make sure about FK's)
DELETE FROM YourTable WHERE ID=3
GO
--Now set the idenetity_insert OFF to back to the previous track
SET IDENTITY_INSERT YourTable OFF
DBCC CHECKIDENT(table_name, RESEED, value)
Table_name =给出要重置的表的值
Value =初始值为0,以1开始单位列
你需要
set identity_insert YourTable ON
然后删除行并重新插入不同的标识。
插入完成后,不要忘记关闭identity_insert
set identity_insert YourTable OFF