2

people100,000 レコード未満のテーブルがあり、次を使用してこのテーブルのバックアップを作成しました。

create table people_backup as select * from people 

時間の経過とともにいくつかの新しいレコードをテーブルに追加peopleしましたが、最終的にはバックアップ テーブルのレコードを にマージしたいと考えていますpeople。残念ながらDROP、新しいレコードが失われるため、テーブルを単純化することはできません!

したがって、主キーに基づいてpeople、のレコードを使用してテーブル内のレコードを更新したいのですが、これを行う2つの方法が見つかりました。people_backupid

  1. テーブルをまとめてマージする
  2. ある種の派手な相関更新を使用する

すごい!ただし、これらの方法はどちらも使用SETし、更新する列を指定する必要があります。残念ながら、私は怠け者であり、の構造はpeople時間の経過とともに変化する可能性があり、CTASステートメントを更新する必要はありませんが、更新/マージ スクリプトを変更する必要があり、それは私にとって不必要な作業のように感じます。

列を指定せずに行全体をマージする方法はありますか? ここで、列を指定しないと、SQL で値を順番に挿入するように指示されることがわかります。ここでINSERT同じ方法を適用できますか?これは安全ですか?

注意: テーブルの構造はバックアップ間で変更されません

4

1 に答える 1

2

テーブルが小さいことを考えると、単純に

DELETE FROM table t
 WHERE EXISTS( SELECT 1
                 FROM backup b
                WHERE t.key = b.key );

INSERT INTO table
  SELECT *
    FROM backup;

これは遅く、特にエレガントではありません (特に、バックアップからのデータのほとんどが変更されていない場合) が、2 つのテーブルの列が一致すると仮定すると、列を一覧表示しないようにすることができます。個人的には、更新できるように、列名を書き出すことを強く好みます (おそらく、それらはそれほど頻繁に変更されることはありません)。

于 2015-11-06T15:52:15.120 に答える