2

約 14 万件のレコードを含む連絡先の既存のテーブルがあります。1 つの parent_contact が多くの連絡先を持つことができるように、親テーブル (「parent_contacts」と呼びましょう) を導入しています。ただし、最初は、現在データベースに存在する連絡先ごとに 1 つのレコードを持つように、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 を作成し、Identity や Primary key を入れないでください。

ParentContacts に挿入されたバックフィル ParentContacts Select Parent_id, .... 連絡先から

Identity (次の値へのシードを忘れないでください) と主キーを ParentContacts に追加し、外部キー制約を Contacts に追加します。

あなたが今試しているこの布全体の操作の代わりに、素敵な簡単なステップとそれぞれを簡単にチェックできます.

于 2012-04-13T17:14:43.917 に答える