65

私はモック航空予約データベースの予約手順を書いていますが、本当にやりたいことは次のようなものです:

IF EXISTS (SELECT * FROM LeadCustomer 
    WHERE FirstName = 'John' AND Surname = 'Smith') 
THEN
   INSERT INTO LeadCustomer (Firstname, Surname, BillingAddress, email) 
   VALUES ('John', 'Smith', '6 Brewery close,
            Buxton, Norfolk', 'cmp.testing@example.com');

ただし、Postgres はIFPL/pgSQL 拡張機能をロードしないステートメントをサポートしていません。これと同等の方法があるのか​​ 、それともこのステップでユーザーの操作が必要になるだけなのか疑問に思っていましたか?

4

2 に答える 2

119

その特定のコマンドは次のように実行できます。

insert into LeadCustomer (Firstname, Surname, BillingAddress, email)
select 
    'John', 'Smith', 
    '6 Brewery close, Buxton, Norfolk', 'cmp.testing@example.com'
where not exists (
    select 1 from leadcustomer where firstname = 'John' and surname = 'Smith'
);

select ステートメントの結果を挿入し、select顧客が存在しない場合にのみ行を返します。

于 2013-03-29T20:01:22.493 に答える
8

pgsql バージョン 9.5 以降では、INSERT ... ON CONFLICT DO UPDATE ...を使用して upsert が含まれています。

以下の回答はもはや関係ありません。数年後に Postgres 9.5 がリリースされ、より優れたソリューションが提供されました。

Postgres には、新しい機能を追加しない限り、" upsert " 機能はありません。
選択クエリを実行して、一致する行があるかどうかを確認する必要があります。その場合は、挿入してください。

アップサートを正確に望んでいないことは知っていますが、ほとんど同じです。

于 2013-03-29T19:38:40.560 に答える