如何重新分配自增主键的值?

3

是否可以设置自增字段的值?如果使用主键5删除了记录,但是当前的自增计数为10,是否有办法重新插入该记录,并使其主键仍然保持在5(而不是11)?我正在尝试使用C#中的Entity Framework 4.1完成此操作。

4个回答

5
我认为您也可以使用

标签。

Set Identity_Insert TableName ON 
 Update your Id value
Set Identity_Insert TableName OFF

这似乎是一个非常好的建议。我将不得不想办法在C#中运行这个原始SQL,如果它有效,我会将其标记为答案。 - Travis J
我得到了这个错误:异常详细信息:MySql.Data.MySqlClient.MySqlException: 未知系统变量'Identity_Insert' - Travis J
db.Database.ExecuteSqlCommand("Set Identity_Insert Work Insert ON"); - Travis J
@TravisJ 如果你能的话就揍我吧...我刚刚更新了我的答案...在语句中多打了一个Insert...很抱歉:(...现在应该可以工作了.. - NiK
当我尝试该命令时,它是无效的。然而,我可能已经找到了为什么Identity_Insert不起作用的原因。显然,这是MSSQL特定的功能,而MySql允许显式插入。我会尝试这个并回复你。 - Travis J
显示剩余2条评论

2

引用自Tom Haigh:

您可以删除主键列并重新创建它。我认为所有的id将按照插入行的顺序被重新分配。

然而,我不确定为什么您要这样做,特别是如果您有其他表保存了对该表的外键。如果是这样的话,您还需要更新那些字段,此时删除并重新创建列就不是一个好的解决方案。您可以将该列重命名,删除autoinc/primary key属性,然后创建一个新的autoinc primary key列。然后,您将同时拥有旧和新的id,您可以使用它们来更新这些外键。


我之前确实已经读过那个人的答案,当时和现在看来都有点过度设计。 - Travis J

1

您可以禁用标识规范。您的主键将保持不变,但您可以插入一个具有所选ID的新记录。 在插入记录后,您可以重新启用标识规范。


0

虽然这里有几个好的建议,但在处理这个问题的解决方案时,我意识到了几件事情。披露数据库是MySQL可能会对此有所帮助,但当时我没有意识到差异会如此重大。实际上,在MySql中,没有锁来防止插入自动递增主键。因此,此代码可用于插入一个主键小于当前自动递增索引值的记录:

        var sql = @"INSERT INTO Work (
            WorkId ,
            LotId ,
            Description ,
            )
            VALUES (
            '5',  '5', 'This Works'
            );";
        using (var db = new Context())
        {
            db.Database.ExecuteSqlCommand(sql);
        }

即使当前的自增计数为11,也要将记录正确地插入到索引为5的位置。


有些人会想知道为什么会有这种必要性。实际上,这种情况很少发生,我使用它的目的是实现一个恢复功能,可以使用原始主键还原记录。 - Travis J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接