在添加FK

时间:2015-11-11 12:27:38

标签: sql sql-server database entity-framework sql-server-2008

CustomerID(PK),各个领域。

CustomerDeletedCustomer表的几乎完全相同的副本。客户经常在Customer表中复制(添加新客户的过程仅使用公共字段(如姓名和位置)进行检查,因此如果用户添加他/她错误地填写姓名或位置,则会是Customer表中同一客户的两条记录,一旦发现重复,最后添加的条目将从Customer表中删除并插入CustomerDeleted包含存储当前/有效客户ID的列的表。

Beneficiary:ID(PK),各个字段。

CustomerBeneficiaryCustomerIDBeneficiaryID(两者都是PK)。 CustomerBeneficiary表之间的链接表。每个客户都可以拥有一定数量的受益人。

我想做什么

CustomerID表格中的BeneficiaryIDCustomerBeneficiary设置为各自表格的FK。

问题

CustomerBeneficiary中可能存在与当前CustomerCustomerDeleted相关联的受益人的记录,因此,如果您只是尝试添加指向Customer表的FK它会给你以下错误

  

ALTER TABLE语句与FOREIGN KEY约束冲突

如何......?

我需要更新CustomerBeneficiary表,以便所有包含CustomerDeleted客户ID的记录都指向有效/当前客户ID。删除的客户ID可能链接到与当前客户ID相同的受益人ID,因此无法执行UPDATE语句,因为CustomerBeneficiary表中存在重复的PK。

我认为必须有INSERT(添加新行,以便当前客户指出他们的重复帐户所链接的任何受益人),然后是DELETE(删除CustomerBeneficiary表中CustomerID是已删除客户的一部分的所有行。

现在,虽然我知道需要发生什么,但我的SQL知识非常有限,而且我完全不知道如何进行这样复杂的查询。我希望我已经足够好地解释了这个情况。有人可以帮忙。

1 个答案:

答案 0 :(得分:1)

添加已删除客户关系且当前客户不

的关系
INSERT INTO CustomerBeneficiary  
SELECT DISTINCT cd.currentCustomer, cb.BeneficiaryID 
FROM CustomerBeneficiary cb 
INNER JOIN CustomerDeleted cd
    ON cb.CustomerID = cd.CustomerID
WHERE cb.CustomerID in (SELECT CustomerID
                        FROM CustomerDeleted
                        WHERE currentCustomerID is not null)
    AND
      cd.currentCustomerID not in (SELECT CustomerID 
                                 FROM CustomerBeneficiary
                                 WHERE CustomerID = cd.currentCustomerID
                                 AND BeneficiaryID = cb.BeneficiaryID )

删除与不在客户表

的客户的所有关系
DELETE
    FROM CustomerBeneficiary 
    WHERE CustomerID not in (SELECT CustomerID FROM Customers)

现在您可以添加外出键