PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да разграничим име на променлива plpgsql в клауза ON CONFLICT?

за начало, name е лошо име както за променлива, така и за атрибут. Когато имате и двете, кодът няма да изглежда добре. имайки това предвид, можете да "префиксирате" променлива с етикетиран блок (в примера по-долу <<fn>>``), and set variable_conflict`, за да дадете предпочитание на име на колона, вижте кода по-долу:

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

и по-нататък - всъщност цялата връзка е за това.

И все пак - след като демонстрирах колко конкретна задача може лесно да се направи с plpgsql, аз все пак цитирам namual:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Повторно използване на изчислената избрана стойност

  2. Най-добрият начин за предотвратяване на дублиране на данни при копиране на csv postgresql

  3. Промяна на типа колона на по-дълги низове в релси

  4. Как да попреча на потребителя да вижда други бази данни и таблици от други бази данни?

  5. Тип на Java в JDBC към Postgres ltree