将主键重置为1
将主键重置为1
我有一个用于微软SQL Server数据库的脚本,其中包含数百个表格,这些表格也包含数据。这是一个网络应用程序的数据库。我想要做的是删除之前的记录并将主键重置为1或0。
我尝试过以下代码`DBCC CHECKIDENT ('dbo.tbl', RESEED, 0);`,但是对于大多数表格,主键并不是自增的,所以这个方法对我不起作用。
由于该表的主键在许多其他表格中被用作外键,所以我不能截断表格。
我还尝试了在表格的主键中添加标识规范,并运行checkident查询,然后再将其改回非标识规范,但是在再次添加记录后,它会从上次停止的地方开始。
对我来说,改变代码不是一个选项。
请帮忙解决。
根据您的问题,我不确定主要目标是什么,为什么呢?如果您需要截断许多表并更改它们的结构以具有Identity属性,为什么不能禁用FK?过去,我使用了一个标准流程来重建表格并迁移所有信息,这代表了一组步骤,我会尝试帮助您,但您应该按照以下步骤进行操作。
步骤:
1)禁用FK以更改表格的结构。您可以在下面的链接中找到此任务的解决方案:Temporarily disable all foreign key constraints
2)使用新的Identity属性修改表格,这是一个典型的ALTER TABLE xxxxxx过程。
3)执行之前发布的语法:
DBCC CHECKIDENT ('dbo.tbl',RESEED,0);
尝试按照这个路径进行操作,如果遇到任何问题,请随时向我们提问。
重置主键为1的问题出现的原因是,有些表使用了从未知来源获取的主键值,无法直接修改。解决方法是在这些表上创建一个after insert触发器,通过减去一个常数来修改新插入记录的主键值。
触发器的代码如下:
CREATE TRIGGER trg_sometable_ai ON sometable AFTER INSERT AS BEGIN UPDATE st SET st.pk_col = st.pk_col - 5253 FROM sometable AS st INNER JOIN INSERTED AS i ON i.pk_col = th.pk_col END
需要根据每个表确定下一个主键值和对应的“减数”。如果代码还向具有外键引用的表插入子记录,并使用先前生成的值作为外键值,还需要修改这些触发器。
总之,这是一种“最后的手段”,不建议在其他有其他选项的情况下使用。修改主键值通常不是一个好主意。