1

私の問題は非常に簡単に説明できますが、正しい答えを見つけることができません!

mysql には、tA、tB、tC と呼ばれる 3 つのテーブルがあります。次のような階層アーキテクチャを持つ tA に 1 つのエントリ A、tB に 2 つのエントリ B、tC に 3 つのエントリ C があります。

            A
            |
     ----------------
     |              |
     B1             B2
     |              |
 --------           |
 |      |           |
 C1     C2          C3

ご想像のとおり、B エントリが A id の A エントリにリンクされ、C エントリが B id の B エントリにリンクされています。

これらのデータを次の場所にコピーしたいだけです:

            A'
            |
     ----------------
     |              |
     B1'            B2'
     |              |
 --------           |
 |      |           |
 C1'    C2'         C3'

最初に、A' を作成し、A' にリンクされた B エントリをコピーすることから始めます。心配ない。

しかしその後、左結合で C エントリを C' にコピーするように要求しました。それはほぼ機能します...唯一の問題は、このように、私の C' エントリが B' id ではなく B id にリンクされていることです !!!!

他のものを試してみますが、それを行う方法がわかりません。とてもシンプルに思えます。疲れたのかな… B エントリを 1 つずつコピーし、現在の B エントリのすべての C エントリをコピーしてから、次のエントリに移動する必要があるかもしれません。

しかし、それを行うためのよりスマートな方法はありませんか? insert_id、カスケード、トリガー、外部キーで???

私はSQLの専門家ではありません。誰かが良い解決策を見つけてくれることを願っています。

事前に感謝します。

バスティアン

4

2 に答える 2

0

元のセットの ID を含む 2 番目のテーブル セットに列を追加します。A' を作成したら、元の ID を使用して B' エントリを作成できます。次に、B' の元の ID を使用して C' を作成します。

わかる?

そのため、@bastien からの詳細情報を参考に、tableA に のような列を追加することをお勧めしますold_id。コピーした行を挿入するときは、元の行を に入れidますold_idold_idその後、tableB、tableC などで関連する行を見つけるために使用できます。

于 2012-10-18T01:58:11.013 に答える
0

Alain の方法は、これを純粋に SQL で処理するための可能な方法ですが、基本的にオブジェクトのコピー元の元の ID を格納するために、いくつかのテーブルの変更が必要です。

php を使用しているとおっしゃいましたが、もっと適切な例を挙げたいと思いますが、php から離れすぎています。ただし、次のことができるはずです。

  1. データベースから A を取得し、A id を php の変数に格納します ($oldAID を提案)
  2. A プロパティをコピーし、A' としてデータベースに保存します。
  3. 最後の挿入 ID を取得し、変数として保存 ($newAID を提案)
  4. 親が $oldAID である DB からすべての B レコードを取得します
  5. b レコードをループし、現在のレコード ID を $oldBID として保存します。
  6. B1 プロパティをコピーし、親 ID $newAID を使用して B1' として DB に保存します
  7. $newBID として最後の挿入 ID とストアを取得します
  8. 親 ID = $oldBID の DB からすべての C レコードを取得します
  9. コピーを作成し、親 ID = $newBID で DB に保存します
  10. ステップ 5 で開始したループを繰り返します

PHP を使用して最後の挿入 ID のタブを保持することにより、必要なコピーを作成して正確に保つことができます。これの欠点は、php と MySQL の間で多くのやり取りがあるため、非常に大きなセットでは、数レベルの深さになるため、このようなプロセスに数秒かかる可能性があることです。ただし、通常のセットが例のように小さくて浅い場合は、それほど悪くはありません。

于 2012-10-18T16:38:15.387 に答える