sql >> Database >  >> RDS >> PostgreSQL

Hoe de naam van een plpgsql-variabele ondubbelzinnig maken in een ON CONFLICT-clausule?

om te beginnen, name is een slechte naam voor zowel variabele als attribuut. Als je beide hebt, ziet de code er niet goed uit. met dat in gedachten, kunt u een variabele "prefixen" met een gelabeld blok (in het voorbeeld hieronder <<fn>>``), and set variabele_conflict` om de kolomnaam de voorkeur te geven, zie onderstaande code:

t=# create or replace function func(
    name text
) returns void language plpgsql as
$$
#variable_conflict use_column
<<fn>>
declare name text :='blah';
begin
    insert into test (name) values (name)
    on conflict (name) do            -- this no longer fails
    update set name = fn.name;
end;
$$;
t=# insert into test select 'b';
INSERT 0 1
Time: 8.076 ms
t=# select func('b');
 func
------

(1 row)

Time: 6.117 ms
t=# select * from test;
 name
------
 b
 blah
(2 rows)

https://www.postgresql.org /docs/current/static/plpgsql-implementation.html#PLPGSQL-VAR-SUBST

en verder - eigenlijk gaat de hele link erover.

En toch - na te hebben aangetoond hoe een bepaalde taak dit gemakkelijk kan worden gedaan met plpgsql, citeer ik nog steeds namual:



  1. HOE:Geplande taken uitvoeren met Microsoft Access

  2. Eenvoudige update-instructie zodat alle rijen een andere waarde krijgen

  3. Evolutie van fouttolerantie in PostgreSQL

  4. Hoe case-statement te gebruiken in waar-voorwaarde?