更改数据库行的主键值

Posted

技术标签:

【中文标题】更改数据库行的主键值【英文标题】:Changing primary key value for a database row 【发布时间】:2013-09-19 07:47:50 【问题描述】:

我正在使用 SQL Server Management Studio,我想使用不同的值更改表行的自动递增主键值。 SQL Server Management Studio 在打开表格进行编辑后,当然会将此字段的所有行显示为灰色。

有可能吗?我想使用我们错误删除的行数,因此它是有效的(与其他主键值没有冲突)并且 - 最重要的是 - 添加到数据库中的下一行应该具有完整的自动递增值。

谢谢。

编辑:丢失与此 PK 上其他表记录的链接对于这一行来说不是问题。我们可以手动恢复。

【问题讨论】:

不要使用主键作为无间隙排名数字或类似的东西。 @juergend 你不能强调这一点。我建议这应该是答案! 我需要为业务数据库快速恢复这种情况。如果您推荐不同的设计方法,我很感激,但这并不能解决我的问题。 选择临时表中的记录-更新临时表以修复顺序-删除并创建原始表-在新表中插入临时表中的记录 您不能更新 IDENTITY 列的值 - 如果确实必须,您只能在 INSERT 上显式设置它。 【参考方案1】:

不一定推荐,但是,在您想要更改数字的行中插入一份副本,但带有您需要的 ID:

SET IDENTITY_INSERT aTable ON
GO

-- Attempt to insert an explicit ID value of 3
INSERT INTO aTable (id, product) VALUES(3, 'blah')       
GO

SET IDENTITY_INSERT aTable OFF
GO

然后删除您不想要的编号所在的行(在您更新任何 FK 引用之后)。

更多详情:http://technet.microsoft.com/en-us/library/aa259221(v=sql.80).aspx


为了后代,为了澄清下面评论中的问题,只有当您插入一个大于当前最大值的值时,自动增量值才会受到影响。

引用链接文章:

如果插入的值大于当前标识值 表中,SQL Server 自动使用新插入的值作为 当前身份值。

【讨论】:

它适用于我的数据库表的备份副本!这会影响下一个自动增量值吗?如果不是,这就是我正在寻找的解决方案!

以上是关于更改数据库行的主键值的主要内容,如果未能解决你的问题,请参考以下文章

数据库中 主键与外键的区别?

更改主键值

javaWeb_JDBC_JDBC获取数据库自动生成的主键值

MyBatis应用记录:MyBatis如何得到插入数据之后的主键值

得到数据库自动生成的主键值

MyBatis 插入时返回刚插入记录的主键值