在添加 FK 之前清理表



表格

Customer:ID(PK),各种字段。

CustomerDeleted:几乎是Customer表的精确副本。客户确实经常在Customer表中出现重复(添加新客户的过程仅使用名称和位置等常见字段进行检查,因此,如果添加的用户拼写错误,则Customer表中会有同一客户的两条记录),一旦发现重复,最后添加的条目将从CCD_ 7表中删除,并插入到CCD_

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

CustomerBeneficiary:CustomerIDBeneficiaryID(PK二者)。CustomerBeneficiary表之间的链接表。每个客户都可以有一定数量的受益人。

我想做什么

CustomerBeneficiary表中的CustomerIDBeneficiaryID设置为它们各自表的FK。

问题

CustomerBeneficiary中可能有受益人链接到当前CustomerCustomerDeleted的记录,因此,如果您只是尝试添加指向Customer表的FK,则会出现以下错误

ALTER TABLE语句与FOREIGN KEY约束冲突

如何

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

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

现在,虽然我知道需要做什么,但我的SQL知识非常有限,我完全不知道如何进行这种复杂的查询。我希望我已经很好地解释了情况,有人能伸出援手。

添加关系,其中删除的客户有关系,而当前客户没有

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)

现在您可以添加您的外键

最新更新