2012-04-13 107 views
2

我有一个现有的联系人表,其中有大约140k条记录。我介绍了一个父表(我们称它们为“parent_contacts”),这样一个parent_contact可以有很多联系人;但最初,parent_contacts将被播种为对于数据库中当前存在的每个联系人都有一条记录。是否有一个替代方法来使用嵌套SELECT(不允许)更新?

我以为我是在试图像下面,我现在明白了是不允许的聪明(假设所有必要的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解决了这个问题,然后在完成播种之后将其删除。但在原始问题的背景下,我认为托尼的回答听起来很恰当。

+1

你为什么选择任意记录链接?你不想将联系人与其父母联系人联系起来,比如说,根据匹配的姓名吗? – mellamokb 2012-04-13 16:53:14

+0

对不起,我可能应该注意到 - 父对象实际上只是用来收集相关记录的一种方式(或者将以这种方式前进;最初它们只会有一条记录)。它们不过是一个指向其他事物的标识,因此子记录选择哪一个并不重要。 – user1332056 2012-04-13 17:05:10

+0

我只是想知道这种情况是不是会以某种方式与[我关于update-select查询的问题有关[肯定不会被禁止]](http://stackoverflow.com/questions/10091788/will-sql-update-affect-它的子查询 - 在更新运行期间)...看那里,也许你会找到一些灵感。 – TMS 2012-04-13 17:19:04

回答

1

你似乎已经做到了这一点向后

添加PARENT_ID到联系人(目前还没有限制!) 更新联系人填充PARENT_ID有一个唯一的编号。 创建ParentContracts,不要将Identity或Primary键。

用INSERT INTO ParentContacts选择PARENT_ID回填ParentContacts,......从联系人

添加身份(不要忘记种子下一个值)和主键ParentContacts 外键约束添加到联系方式。

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

相关问题