Insertion conditionnelle dans la déclaration de postgres

j'écris une procédure de réservation pour une base de données de réservation de ligne aérienne simulée 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', cmp.testing@example.com');

mais Postgres ne supporte pas les déclarations IF sans charger L'extension PL/pgSQL. Je me demandais s'il y avait un moyen de faire un équivalent de ceci ou s'il va juste y avoir une interaction d'utilisateur dans cette étape?

25
demandé sur Meredith 2013-03-29 23:29:28

2 réponses

que la commande spécifique peut être faite comme ceci:

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

il insérera le résultat de la déclaration select, et le select ne retournera une ligne que si ce client n'existe pas.

53
répondu Clodoaldo Neto 2013-08-09 01:30:00

à partir de la version 9.5 de pgsql upsert est inclus, en utilisant INSERT ... SUR LES CONFLITS DE FAIRE LA MISE À JOUR ...

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" upsert " fonctionnalité sans ajouter de nouvelles fonctions.

Ce que vous devez faire est d'exécuter l'sélectionnez interrogez et voyez si vous avez des lignes correspondantes. Si vous le faites, puis l'insérer.

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

1
répondu Trenton Trama 2017-11-15 21:20:22