2016-05-15 17 views
1

を持つすべての行は、私は店の設定変数に、このPostgreSQLのテーブルを使用しています:更新1つのSQLクエリ

CREATE TABLE SYS_PARAM(
SETTING_KEY TEXT NOT NULL, 
VALUE_TYPE TEXT, 
VALUE TEXT 
) 
; 

enter image description here

私は1つのSQL文を使用して、すべての構成設定値を更新するにはどうすればよいですか?

+0

パラメータごとに個別の更新を使用するだけです。 –

+0

はい、努力はSQLクエリの数を減らすことです。もし何百行もあれば?あまりにも多くのクエリを簡単に管理することはできません。 –

+1

特定のパフォーマンス上の問題を解決している場合を除き、EAVデータ・モデルで複数の行を更新しようとするのは時期尚早の最適化です。トランザクション内で更新をラップすることができるので、それらはすべて一度に実行されます。そのような設定を変更することはまれであるはずです。数百のクエリを実行するのに数百ミリ秒かかる場合でも、全体的なパフォーマンスにはほとんど影響しません。 –

答えて

1

あなたが時間をかけて一度か二度よりもこれらの更新プログラムの詳細を実行することを計画している場合、機能があなたのためにこれを扱う持って良いでしょう。あなたはそうのように、関数内で可変引数パラメータの型としてテーブル自体を使用することができます。

-- The function 
CREATE OR REPLACE FUNCTION update_sys_param(VARIADIC params sys_param[]) 
RETURNS VOID 
AS $$ 
BEGIN 

    UPDATE sys_param 
    SET value_type = upd.value_type, value = upd.value 
    FROM 
    sys_param src 
    INNER JOIN 
    UNNEST(params) upd 
    ON (src.setting_key = upd.setting_key); 

END; $$ LANGUAGE PLPGSQL; 

-- To call it 
SELECT update_sys_param(('SMTP_PORT','int','123'),('SMTP_OTHER','text','435343')); 

しかし、これは1回の更新である場合は、これら二つのいずれかを試すことができます。

CASE

を使用して

UPDATE sys_param 
    SET 
    value_type = new.value_type, 
    value = new.value 
FROM 
    sys_param src 
INNER JOIN 
    new_params new --< this table/view/cte must already exist or you must create it. 
    ON (src.setting_key = new.setting_key); 

UPDATEをJOINを使用してUPDATE 0

+0

'UPDATE CASE'の例では、どのように 'value_type'列も更新できますか? (特定のケースの場合のみ) –

+0

@PeterPenzov同様のケースステートメントを追加する必要があります。概念は同じです。私はあなたのためにすべての仕事をすることをためらっています:-)。あなた自身で試してみてください。そうするには十分な情報が必要です。それが学ぶ最も良い方法です。 – Nicarus

+0

@PeterPenzov - あなた自身で試してもまだ問題が残っている場合は、私に知らせてください。私はあなたを歩いてくれるでしょう。 – Nicarus

1

相関更新を行うことでこれを達成できると思います。

以下の記事を参照してください:

https://www.ibm.com/support/knowledgecenter/ssw_i5_54/sqlp/rbafyexsub4.htm

+0

いくつか例を挙げてもらえますか? –

+0

@PeterPenzov - リンクshankarsh15には2つの例があります。つまり、ソーステーブルを更新する新しい値を持つ別のテーブルが必要です。ソーステーブルを直接更新するだけではなくても、これと同じくらい多くの作業が必要になります。 – Nicarus