我有一个现有的联系人表,其中有大约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解决了这个问题,然后在完成播种之后将其删除。但在原始问题的背景下,我认为托尼的回答听起来很恰当。
你为什么选择任意记录链接?你不想将联系人与其父母联系人联系起来,比如说,根据匹配的姓名吗? – mellamokb 2012-04-13 16:53:14
对不起,我可能应该注意到 - 父对象实际上只是用来收集相关记录的一种方式(或者将以这种方式前进;最初它们只会有一条记录)。它们不过是一个指向其他事物的标识,因此子记录选择哪一个并不重要。 – user1332056 2012-04-13 17:05:10
我只是想知道这种情况是不是会以某种方式与[我关于update-select查询的问题有关[肯定不会被禁止]](http://stackoverflow.com/questions/10091788/will-sql-update-affect-它的子查询 - 在更新运行期间)...看那里,也许你会找到一些灵感。 – TMS 2012-04-13 17:19:04