关于sql server:将主键重置为1

Resetting the primary key to 1

我有一个microsoft sql server数据库的脚本,它有数百个表和表包含数据。 这是Web应用程序的数据库。我想要做的是删除以前的记录并将主键重置为1或0。
我试过了

1
`DBCC CHECKIDENT ('dbo.tbl',RESEED,0); `

但它对我不起作用,因为在大多数表中主键不是标识。

我不能截断表,因为它的主键在许多其他表中被用作FK。
我还尝试在表的主键中添加标识规范并运行checkident查询,然后将其更改回非标识规范,但在再次添加记录后,它从它离开的位置开始。
对代码进行更改不是我的选择。

请帮忙。


我对这个问题的理解:
您有一个数据库,其中包含要清空的表,然后让它们使用从0或1开始的主键值。
其中一些表使用标识值,您已经有了解决方案(您知道可以通过使用sys.columns视图找出哪些列具有标识?查找is_identity列)。
有些表不使用标识,但从未知来源获取其pk值,我们无法修改。

我看到的唯一解决方案是在那些从新的pk值中减去的表上创建一个后插入触发器(或修改)。
例如:您的"隐藏生成器"将生成下一个值5254,但您希望下一个pk值变为1:

1
2
3
4
5
6
7
8
9
10
11
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

您必须确定下一个值,从而确定每个表的"减去值"。

如果代码还将子记录插入到具有此表的外键的表中,并使用以前生成的值,则还必须修改这些触发器...

这是一个"最后的手段"解决方案,我建议在任何具有其他选项的情况下反对。操纵主键值通常不是一个好主意。


根据你的问题,我不确定主要目标,为什么?如果您需要截断大量表并更改其结构以具有Identity属性,为什么您无法禁用FK? 。在过去,我使用标准流程来重建表并迁移所有信息,这代表了一组步骤,我会尽力帮助您,但您应该按照后续步骤操作。

脚步:

1)禁用FK以更改表的结构。您可以在下一个链接中获取此任务的解决方案:

暂时禁用所有外键约束

2)使用新属性Identity更改表,这是ALTER TABLE xxxxxx的经典过程。

3)执行以前发布的语法:
DBCC CHECKIDENT('dbo.tbl',RESEED,0);

尝试遵循这条道路,如果您有任何问题,请问我们。


您不能截断具有关系的表。你首先要删除关系。