2009-05-15 10 views
2

私は、大量の基本的にハードコードされたデータを含む趣味アプリと、それを配備すると動的ユーザデータを含む趣味アプリを開発中です。ハードコードされたデータをローカルで更新する機能が必要です(よりもINSERT秒以上)、これらのデータをサーバーにエクスポートします。つまり、データをファイルにダンプし、新しい行(比較的少数)がINSERTになり、既存の行(PKで識別される)がUPDATE dになるようにインポートする必要があります。明らかに、新しい行はサーバー上でINSERTになることはできません(または、PKが潜在的に衝突して、誤ってUPDATEを発行する可能性があります)。これは許容可能な制限です。しかし、ユーザがアクセス可能なテーブルは "静的な"テーブルにFK制約を持つため、UPDATE dであるDELETEの行を同期テーブルを削除することはできません。PostgreSQLの既存の行をインポート/更新する

残念ながら、これは非常に難しいようです。 GoogleとPostgresのメーリングリストでは、「on_duplicate_key_update」という新しい機能が、「pg_loader can do it」の表示と一緒に、新しいバージョンになることを伝えています()。

最悪の場合のシナリオでは、私は自宅のソリューション(データファイルをダンプし、PKの競合をチェックし、INSERTまたはUPDATEの文を適切に発行するカスタムインポートスクリプトを作成する)他の人が私の前で必ず遭遇した問題のために、非常に不器用な解決策に思えます。

どのような考えですか?

+1

自分の好奇心のためだけに、サーバー上の更新/挿入を行うのはなぜですか?あなたのすべての問題を解決するようです。 –

+0

できます。主な理由はセキュリティ(自宅のシステムでは、私はむしろ攻撃者にコアデータを公開しないだろう...)と、ネット接続なしで頻繁に働くという事実です。 –

+1

私には分からないことがあるはずです。編集を行った場所に基づいてデータの脆弱性はどのようになりますか? –

答えて

0

あなたはローカルでpostgresqlを実行したことがありますか?

  1. クエリーログ
  2. 上のダンプ・サーバ・データ
  3. インポートローカル
  4. 電源を入れアップデート
  5. テイククエリログを作成し、サーバー
  6. クリアクエリログ

またはAM上で実行私はあなたがしようとしていることを誤解していますか?

+0

誤解なし:これは間違いなく実行可能な解決策です。私はローカルのPostgresサーバー(実際にはそれぞれ2つ、ラップトップとデスクトップ)を既に実行しています。それは理想的なものより少しベビーシッターが必要な解決策のように聞こえます(すべてのサーバーアップデートでログを管理してリセットし、2台のローカルマシン間で同期させる必要があります)が、確かに*動作します*。 –

0
create temporary table newdata as select * from table1 where false; 

、その後、新しいデータでNEWDATAを入力します。

start transaction; 
create function fill_table1() returns void as 
$$ 
declare 
    data record; 
begin 
    for data in select * from newdata 
    loop 
     update table1 set 
      column1 = data.column1, 
      column2 = data.column2 
     where id = data.id 
     if not found then 
      insert into table1 values data.*; 
     end if; 
    end loop; 
end; 
$$ language plpgsql; 
select fill_table(); 
drop function fill_table(); 
commit; 

をそれはおそらく動作するようにいくつかの調整が必要になりますので、これはテストされていません。実行中にテーブルが変更されないようにする必要があります。

2

ええ、一時テーブル+挿入/更新のいくつかの組み合わせは行く方法です(あなたは関数でそれをする必要はありませんができます)。

レコードの場合、探している機能はマージコマンドです。誰かがパッチを書いたが、それは決して終わらなかった。 AFAIKは誰もそれに取り組んでいません。 Postgres 8.4がリリースされることは間もなくありません。

0

この質問はthisに似ているようだ:

たぶん、あなたは私がそこに提供される解決策を確認することができます。