web-dev-qa-db-fra.com

Instruction INSERT INTO conditionnelle en postgres

J'écris une procédure de réservation pour une base de données de réservation de compagnies aériennes simulées et ce que je veux vraiment faire est quelque chose comme ceci:

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]');

Mais Postgres ne prend pas en charge les instructions IF sans charger l'extension PL/pgSQL. Je me demandais s'il y avait un moyen de faire un équivalent de cela ou s'il devait juste y avoir une interaction utilisateur dans cette étape?

36
The General

Cette commande spécifique peut être exécutée comme ceci:

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'
);

Il insérera le résultat de l'instruction select et select ne renverra une ligne que si ce client n'existe pas.

67
Clodoaldo Neto

Depuis la version 9.5 de pgsql upsert est inclus, en utilisant INSERT ... ON CONFLICT DO UPDATE ...

La réponse ci-dessous n'est plus pertinente. Postgres 9.5 est sorti quelques années plus tard avec une meilleure solution.

Postgres n'a pas la fonctionnalité " psert " sans ajouter de nouvelles fonctions.
Ce que vous devrez faire est d'exécuter la requête de sélection et de voir si vous avez des lignes correspondantes. Si vous le faites, insérez-le.

Je sais que vous ne voulez pas exactement un upsert, mais c'est à peu près la même chose.

2
Trenton Trama