2012-04-13 113 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。

相關問題