Sql server 将主键重置为1

Sql server 将主键重置为1,sql-server,database,hibernate,sql-server-2012,Sql Server,Database,Hibernate,Sql Server 2012,我有一个microsoft sql server数据库的脚本,它有数百个表,表也包含数据。这是web应用程序的数据库。我要做的是删除以前的记录并将主键重置为1或0。 我试过了 `DBCC CHECKIDENT ('dbo.tbl',RESEED,0); ` 但它对我不起作用,因为在大多数表中,主键不是identity 我无法截断该表,因为它的主键在许多其他表中用作FK。 我还尝试在表的主键中添加标识规范,并运行checkident查询,然后将其更改回non-identity spec,但在再次

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

`DBCC CHECKIDENT ('dbo.tbl',RESEED,0); `
但它对我不起作用,因为在大多数表中,主键不是identity

我无法截断该表,因为它的主键在许多其他表中用作FK。 我还尝试在表的主键中添加标识规范,并运行checkident查询,然后将其更改回non-identity spec,但在再次添加记录后,它将从保留的位置开始。 对我来说,在代码中进行更改不是一个选项


请帮助。

不能截断具有关系的表。你应该先删除关系。

根据你的问题,我不确定主要目标,为什么?如果需要截断许多表并更改其结构以具有标识属性,为什么不能禁用FK。在过去,我使用标准流程重建表并迁移所有信息,这代表了一组步骤,我会尽力帮助您,但您应该遵循接下来的步骤

步骤:

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

2) 使用新的属性标识更改表,这是更改表xxxxxx的经典过程

3) 执行之前发布的语法: DBCC CHECKIDENT('dbo.tbl',重新设定,0)


试着沿着这条路走,如果你有任何问题,只问我们。

我对这个问题的理解: 您有一个包含要清空的表的数据库,然后让它们使用从0或1开始的主键值。 其中一些表使用标识值,您已经有了相应的解决方案(您知道可以通过使用sys.columns视图找到哪些列具有标识?查找is_标识列)。 有些表不使用标识,而是从未知来源获取它们的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
您必须确定下一个值,从而确定每个表的“减法值”

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


这是一个“万不得已”的解决方案,在任何有其他选择的情况下,我都会建议不要使用它。操作主键值通常不是一个好主意。

我不能这样做,因为它是一个非常大的数据库,我需要一些更好的解决方案。为什么不创建表创建脚本以刷新数据库?右键单击数据库>任务>生成脚本。如果要重新插入某些表,可以通过某种方式创建该表的插入脚本。我重新生成了该脚本并创建了数据库,但它再次从原来的id开始。我不确定要执行什么操作。如果我是对的,您有一些主键不是标识的表,但是您希望在不修改数据的情况下将其值重新设定为1。我说得对吗?@S.Karras我的目的只是在删除数据后将PK重置为0或1,而重新设定种子无法实现这一点。如果没有标识列,则主键会从其他地方获取其值。在你的例子中是如何做到的?这就是问题所在。我不知道它到底是从代码中来的,还是如何做到的,但问题是当新记录从它离开的地方开始添加时,甚至删除了所有数据……主键值是否可能使用要生成的序列?请检查一下好吗?