2011-12-17 12 views
0

主キーで行を更新しようとするSQLクエリを作成する必要があります。存在しない場合は挿入します。このソリューションは、ほとんどのデータベース(MySQL、H2、Postgres、Oracle、DB2、MSSQL、Hsql、Derby)で普遍的である必要があります。 ID(Pr.Key)とあなたがこれを行うには、ストアドプロシージャを使用する必要がtxtの更新するものがない場合に挿入

+2

このため名前は 'UPSERT'です。これは一般に 'MERGE'で達成されますが、これは決して普遍的に利用可能ではありません。あなたは「ほとんどのデータベース」についてより具体的になりますか? –

+1

@Oded何もありません。 –

+0

@MartinSmith私はMySQLで 'REPLACE'ステートメントを知っていますが、これは私が望むだけですが、MySQLでしか動作しないので、ローカルソリューションは適合しません。 –

答えて

3

あなたはSQLのMERGE声明をしたいが、それはどこでも動作しません:

MERGE into thetable using (select theid from thetable) 
when matched then update thetable thecolumn = thevalue where id = theid 
when not matched then insert into thetable blablabla; 

他のソリューションがしようと、とにかく挿入し、エラーを処理し、それが制約違反であるかどうかを検出することですそうであれば代わりに更新してください。たぶん

+0

これは「解決策は普遍的である必要があります」と矛盾します。 – GSerg

+1

まあ、それは私が考えている最も普遍的な要件です...別の解決策は、とにかく挿入しようとするが、それはエラーがユニークなキー制約違反であることを検出することを意味するでしょう! – fge

0

:コード例について

は、2つの列からなる単純なテーブルをご検討ください。 参照:http://jumpingbean.co.za/blog/mysql-if-exists-update-else-insert

+2

これはコメントです。 – Oded

+0

もっと具体的に教えてください。たとえば、テーブルがid(Pr.Key)とtxtの2つのカラムで構成されている場合、クエリはどのように見えますか? –

0

INSERT INTO table (id,txt) VALUES (1,"Hello") 
    ON DUPLICATE KEY UPDATE txt="World"; 

しかし、これはMySQLが唯一

関連する問題