2011-01-31 12 views
1

と同一のテーブル間の行のコピー同じ構造の2つのテーブルがあり、自動インクリメントされたIDがあり、行を一方から他方にコピーしようとしています。自動インクリメントIDの

テーブルAからテーブルBに行をコピーしようとしたときに、テーブルBに既に存在するものと一意のIDが衝突すると、コピーしている行のIDを設定するだけです次の値は自動インクリメントカウンタの値です。

これは私にとって驚くべきことですが、これは証明しています。ここに私が持っているものがあります:

"INSERT INTO tableB SELECT * FROM tableA WHERE tableA.id = '$id'ON DUPLICATE KEY UPDATE tableB.id = LAST_INSERT_ID(tableB.id)" 

それは私のために働いていないようです。もう一つは、キーが変更された場合、新しいキーが何であるかを伝えることができ、私がコピーしている関連テーブルの行に対して必要な変更を加えることができるようにする必要があるということです。

誰かが間違っていることを指摘できますか?

私はここにこれに類似した質問があることを知っています。私はそれらをすべて読んだことがありますが、それでも意味をなさないようです。

背景情報の編集:誰かが私の設定がその方法である理由を尋ねて以来(そして、それが最適でない場合は驚くことはありません)。基本的には、別のウェブサイトからいくつかのものを取り除いて、たくさんの文字列をマッチングしてDBにしています。しかし、スクレイピングプロセスの厄介な性質のために、私は最近スクレイプされたデータに対してライブクエリを実行するのは好きではありません。だから、基本的に私はcronのスケジュールを掻き集め、データの整合性を頻繁にチェックし、それが大丈夫だと思うと、クエリが実行される "ライブ"テーブルにコピーします。

答えて

1

OKアップデートに基づいて、私は単に1つのテーブルを使用します。

フィールド 'checked'のデフォルト値を追加する0 - あなたが決定したデータをコピーするのではなく、単にチェックしたフィールドを2に更新します。使用できない場合は1に更新します。

は定期的にOKとはすぐにはないものを削除すると、まだ1に更新して確認= 1

良いとそれらのレコードを削除します。

+0

ええ、私はデータベースを設計していたときにその方法について考えました(リレーショナルデータベースで作業するたびに初めてのことです)。私は何千ものレコードを持っていたときに余分な列のオーバーヘッドを費やす価値はないと思っていました。データベース。私はそれがちょうどブール型の列の場合、追加のオーバーヘッドはかなり簡単だろうと思う。 –

1

用途:

ON DUPLICATE KEY UPDATE tableB.id = tableB.id 

最後のインサートIDとしてレコードのIDを返す必要があります - その「を挿入」と、あなたの参照整合性の先端、トップを維持していないにも関わらず...

今あなたがやろうとしていることは、私には少し混乱しているようです(もっと説明してください - それはあなたに良い答えを与えるかもしれません)。

なぜaからbにすべてのレコードをコピーする必要がありますか?これらの表は「同一」を意味していますか?

+0

私はそれほど私のために働いていないようです。今はテスト用にtableAにNULL行の束があります。重複キーを持つ行をコピーしようとすると、tableBに何も変わりません。一方、tableBの対応するものがない行のコピーは正常に動作します。私はあなたがそれを述べて以来の私のセットアップがなぜそうであるかに関するいくつかのコメントと私のOPを編集します。 –

関連する問題