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);
尝试遵循这条道路,如果您有任何问题,请问我们。
您不能截断具有关系的表。你首先要删除关系。