web-dev-qa-db-ja.com

postgresの条件付きINSERT INTOステートメント

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

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', [email protected]');

しかし、PostgresはPL/pgSQL拡張機能をロードしないとIFステートメントをサポートしません。これに相当する方法があるのか​​、それともこのステップでユーザーとのやり取りが必要なのか、疑問に思っていました。

36
The General

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

insert into LeadCustomer (Firstname, Surname, BillingAddress, email)
select 
    'John', 'Smith', 
    '6 Brewery close, Buxton, Norfolk', '[email protected]'
where not exists (
    select * from leadcustomer where firstname = 'John' and surname = 'Smith'
);

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

67
Clodoaldo Neto

9.5の時点でpgsqlのupsertが含まれ、 INSERT ... ON CONFLICT DO UPDATE ... を使用して

以下の回答は関係ありません。 Postgres 9.5は、数年後により良いソリューションでリリースされました。

Postgresには、新しい関数を追加することなく「 psert 」機能はありません。
選択クエリを実行し、一致する行があるかどうかを確認する必要があります。もしそうなら、それを挿入します。

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

2
Trenton Trama