将主键重置为1

时间:2016-03-17 07:29:37

标签: sql-server database hibernate sql-server-2012

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

perl -pi -wle's/^(.*?) ([0-9]{5}(?![^ ]))(.*)/$2 $1$3/'

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

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

请帮忙。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

步骤:

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

Temporarily disable all foreign key constraints

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

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

尝试遵循此路径,如果您有任何问题,请向我们询问。

答案 2 :(得分:0)

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

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

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

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

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

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