我有一个现有的联系人表,里面有大约140k的记录。我正在介绍一个父表(让我们称之为“parent_contacts”),这样一个parent_contact可以有很多联系人;但最初,parent_contacts将被播种,以便为数据库中当前存在的每个联系人创建一条记录。
我认为自己在尝试以下内容时非常聪明,我现在明白这是不允许的(假设所有必要的parent_contact记录都是提前创建的):
UPDATE contacts
SET contacts.parent_id =
(SELECT parent_contacts.id FROM parent_contacts
WHERE NOT EXISTS
(SELECT * FROM contacts AS c WHERE c.parent_id = parent_contacts.id) LIMIT 1)
(如果不是很明显,这里的想法是将每个联系人的parent_id设置为另一个联系人尚未链接到的第一个parent_contact的id)
由于这种特殊的方法是不可能的,有没有其他方法可以做到这一点,不涉及执行140k个人更新语句?
FOLLOW-UP:我通过在父表上引入一个临时的child_id来解决这个问题,然后在播种完成后将其删除。但在原始问题的背景下,我认为Tony的答案听起来很合适。
答案 0 :(得分:1)
你似乎向后做了这件事
将Parent_id添加到联系人(尚无约束!) 使用唯一编号更新填充Parent_id的联系人。 创建ParentContracts,不要将Identity放入主键或主键。
回填ParentContacts插入到ParentContacts中选择Parent_id,....来自联系人
添加标识(不要忘记种子到下一个值)和主键到ParentContacts 将外键约束添加到Contacts。
很简单的步骤,很容易检查每一个,而不是你现在正在尝试的整个布料。