2

我有一个现有的联系人表,其中包含大约 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 单独更新语句的方法?

跟进:我通过在父表上引入临时 child_id 解决了这个问题,然后在播种完成后将其删除。但在最初的问题的背景下,我认为托尼在下面的回答听起来很恰当。

4

1 回答 1

1

你似乎已经倒退了

将 Parent_id 添加到联系人(还没有约束!)使用唯一编号填充 Parent_id 更新联系人。创建 ParentContracts,不要将身份放入或主键中。

回填 ParentContacts 用 Insert into ParentContacts Select Parent_id, .... From Contacts

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

非常简单的步骤,并且易于检查每个步骤,而不是您现在正在尝试的整个布料操作。

于 2012-04-13T17:14:43.917 回答