0

MySQL の操作に関して少しアドバイスが必要です。

いくつかのテーブルを生成するデータベース A があります。クエリを使用して、このデータベースから一連のエントリを選択して、これらの結果をデータベース B の別のテーブルにコピーしました。データベース B のテーブルには、データベース A に対するクエリの結果が含まれています。

たとえば、クエリは次のとおりです。

SELECT names.name,ages.age FROM A.names names A.ages ages WHERE ages.name = name.name;

これらの結果をデータベースにコピーするには、BI を実行します。

INSERT INTO B.persons (SELECT name,age FROM A.names names A.age age WHERE age.name = name.name);

ここに私の質問があります: データベース A のデータが変更されたとき、データベース B のテーブルで「更新」を実行したいので、簡単で汚いアプローチは次のようになります: データベース B のテーブルを切り捨て、クエリを再実行します。データベース A にコピーし、結果をデータベース B にコピーします。

しかし、そのクエリの新しい結果行のみがコピーされ、データベース A にはないデータベース B のエントリが削除されるような、よりスマートな方法はありませんか?

要するに、データベース B のテーブルを新しいエントリで「拡張」し、古いエントリを「削除」する方法はありますか?

ご協力いただきありがとうございます

4

2 に答える 2

1

私は2つのことをします:1)データベースBに少なくとも整数または列の一意の組み合わせである主キーがあることを確認します2)物理的な削除の代わりに論理的な削除を使用します。つまり、ブール値の削除された列があります

ポイント 2 により、データを削除したり失ったりする必要がなくなります。フラグを更新してクエリにwhere deleted = 0orを入力するだけwhere deleted is nullです。

主キーと組み合わせると、新しい行を挿入して既存の行を更新する によってすべてを簡単に処理できることINSERT ... WITH DUPLICATE KEYを意味します。つまり、「削除」も同時に実行できます。

于 2013-06-14T08:55:34.050 に答える
1

あなたが説明したことは、テーブルを複製したいように聞こえます。あなたが説明したことに対する簡単な迅速な修正はありません。もちろん、それを行うアプリケーション ロジックを作成することもできますが、各テーブルの各エントリを比較し、それに応じて削除または更新する必要があるため、効率的ではありません。

解決策の 1 つは、A と B の間に外部キー インデックスを設定し、更新と削除を B にカスケードすることです。しかし、これは問題を部分的にしか解決しません。A で削除された場合は B の行が削除され、A で更新された場合は B のキー列が更新されます。ただし、他の列は更新されません。これには、テーブル タイプが INNODB である必要があることにも注意してください。

別の方法は、A の値を使用して B で挿入を実行することですが、

重複キーの更新時に挿入....

繰り返しますが、これは更新では問題なく機能しますが、削除では機能しません。

実際の MySQL レプリケーションをセットアップすることもできますが、これはおそらく問題の範囲を超えており、より複雑です。

最後に、上記のように外部キー インデックスを設定し、A に更新が適用されるたびに B の対応するキー行も更新されるトリガーを作成します。これは、私が認める最もクリーンではありませんが、あなたにとってもっともらしい解決策のようです。

テーブルを複製するために実行している環境で定期的に実行される小さなバッチスクリプトが、探しているものを達成するのに最適であるように思われます。

于 2013-06-14T08:53:30.543 に答える