bắt đầu bằng name
là một tên xấu cho cả biến và thuộc tính. Khi bạn có cả hai, mã sẽ không đẹp. với ý nghĩ đó, bạn có thể "tiền tố" biến với khối được gắn nhãn (trong ví dụ dưới đây <<fn>>``), and set
biến_conflict` để ưu tiên cho tên cột, hãy xem mã bên dưới:
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
và xa hơn nữa - về cơ bản toàn bộ liên kết là về nó.
Chưa hết - sau khi chứng minh tác vụ cụ thể này có thể được thực hiện dễ dàng như thế nào với plpgsql, tôi vẫn trích dẫn namual: