违反 PRIMARY KEY 约束

Posted

技术标签:

【中文标题】违反 PRIMARY KEY 约束【英文标题】:Violation of PRIMARY KEY constraint 【发布时间】:2011-07-22 20:54:28 【问题描述】:

我正在尝试记录唯一标识符,因此我无法承受我的 ID 的重复记录

当我尝试更新名为 Clients 的 SQL Server 表时,我收到了一个类似这样的错误。

违反主键约束“PK_clients”。无法插入 对象“db_owner.clients”中的重复键。

代码如下:

public void Subscribe(string clientID, Uri uri)

    clientsDBDataContext clientDB = new clientsDBDataContext();
    var client = new ServiceFairy.clientURI();
    client.clientID = clientID;
    client.uri = uri.ToString();
    clientDB.clientURIs.InsertOnSubmit(client);
    clientDB.SubmitChanges();
            

任何想法我可以如何解决这个问题,所以我可以更新我的行,我想做的就是当一行存在时,只更新关联的 URI,如果它不存在提交新的客户端 ID + URI,

谢谢

约翰

【问题讨论】:

【参考方案1】:

您要做的是首先检查现有记录,如果不存在,然后添加一个新记录。您的代码将始终尝试添加新记录。我假设您使用的是 Linq2Sql(基于 InsertOnSubmit)?

public void Subscribe(string clientID, Uri uri)

    using(clientsDBDataContext clientDB = new clientsDBDataContext())
    
        var existingClient = (from c in clientDB.clientURIs
                              where c.clientID == clientID
                              select c).SingleOrDefault();

        if(existingClient == null)
        
            // This is a new record that needs to be added
            var client = new ServiceFairy.clientURI();
            client.clientID = clientID;
            client.uri = uri.ToString();
            clientDB.clientURIs.InsertOnSubmit(client);
        
        else
        
            // This is an existing record that needs to be updated
            existingClient.uri = uri.ToString();
        
        clientDB.SubmitChanges();
    

【讨论】:

感谢 Joel,这是一个很好的例子,让弄清楚如何集成变得更加容易,有了这样的例子就让我的生活更轻松了哈哈 与您的评论相反 - Linq2Sql 确实支持 SingleOrDefault,在这种情况下使用它是合适的 我的错误,看起来我将 Linq2Sql 与最早版本的 Entity Framework 混淆了。我已经更新了我的示例。【参考方案2】:

您需要获取现有 对象并更新其uri 属性,然后调用clientDB.SubmitChanges()。您现在拥有的代码非常明确地要求它插入一条新记录。

大概这样的事情会起作用:

using (clientsDBDataContext clientDB = new clientsDBDataContext()) 
    var client = clientDB.clientURIs.Where(c => c.clientID == clientID).Single();
    client.uri = uri.ToString();
    clientDB.SubmitChanges();

【讨论】:

或者,如果您的对象处于旧状态,您可以重新附加它然后对其进行修改。然后提交更改。 谢谢大家非常感谢您的帮助 xD

以上是关于违反 PRIMARY KEY 约束的主要内容,如果未能解决你的问题,请参考以下文章

数据导入时违反 PRIMARY KEY 约束错误

交叉应用和外部应用一起使用时违反 PRIMARY KEY 约束

违反 PRIMARY KEY 约束“PK_Address”。等等......我做错了啥?

违反 PRIMARY KEY 约束“PK_EMPLOYEE”。无法在对象中插入重复键

使用实体框架添加记录时违反链接记录的PRIMARY KEY约束

(转)sql 违反了 PRIMARY KEY 约束,不能在对象 中插入重复键