是否有一种替代方法来使用嵌套的SELECT(不允许)更新UPDATE?

时间:2012-04-13 16:43:40

标签: mysql

我有一个现有的联系人表,里面有大约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的答案听起来很合适。

1 个答案:

答案 0 :(得分:1)

你似乎向后做了这件事

将Parent_id添加到联系人(尚无约束!) 使用唯一编号更新填充Parent_id的联系人。 创建ParentContracts,不要将Identity放入主键或主键。

回填ParentContacts插入到ParentContacts中选择Parent_id,....来自联系人

添加标识(不要忘记种子到下一个值)和主键到ParentContacts 将外键约束添加到Contacts。

很简单的步骤,很容易检查每一个,而不是你现在正在尝试的整个布料。