由于密钥

时间:2016-04-12 13:08:19

标签: sql sql-server

我收到此错误

  

违反PRIMARY KEY约束'X_dbo.XYZ'。无法在对象中插入重复键...

我确信它不是由重复的密钥引起的!

我知道SQL Server在添加行时使用“机制”来插入默认密钥(在我的例子中是一个int)。

删除表中的所有行后,我尝试通过为id指定以前在该表中的值来添加行,我得到此错误。

我认为这是由我不完全理解的“机制”造成的

例如我在表XYZ中有一行

Id     Name
 1     "some name"

我删除了这一行,然后尝试添加一个新的行,其中1为Id

INSERT .... 
VALUES (1, 'some other name for new row')

我收到此错误。

不指定插入中的id不是我的选项,我需要解决这个问题或者这个错误。

谢谢!

已更新

我使用Entity Framework和代码优先方法(C#)

创建表
[Table("XYZ")]
public class XYZ: InheritDb
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long ID { get; set; }
    [Required]
    public string Key { get; set; }
    [Required]
    public string Value { get; set; }

    public string Description { get; set; }
    //....
}

,插入脚本就像

SET IDENTITY_INSERT [dbo].[XYZ] ON 
GO

INSERT [dbo].[XYZ] ([ID], [Key], [Value], [Description], ...) 
VALUES (1, N'PaymentMode', N'Test', N'PaymentMode', ...)

2 个答案:

答案 0 :(得分:1)

如果在表上设置了自动递增,即使删除了记录,该表也不会重置要插入的下一行编号。因此,如果您插入1行,那么将获得ID = 1.如果删除该行并添加新行,则即使1不再存在,该新行也将是ID = 2。要重置它,请使用以下命令

DBCC CHECKIDENT ([dbo].[XYZ], RESEED, 0)

答案 1 :(得分:0)

如果您设置了ID '标识栏' ,则不要插入包含旧ID的行。 对于插入,您必须在“属性”选项卡的“表设计器”中设置'标识列' 是' '