は、このテーブルを考える:ON CONFLICT句でplpgsql変数名を明確にする方法はありますか?
create table test (
name text primary key
);
私はon conflict
句で使用する必要があり、主キーの名前と衝突する変数名とplpgsqlが機能を記述する必要があります。
create or replace function func(
name text -- this variable name...
) returns void language plpgsql as
$$
begin
insert into test (name) values (name)
on conflict (name) do update -- ...conflicts with this line
set name = func.name;
end;
$$;
このコンパイル
select * from func('one');
ERROR: column reference "name" is ambiguous
LINE 2: on conflict (name) do update
^
DETAIL: It could refer to either a PL/pgSQL variable or a table column.
QUERY: insert into test (name) values (name)
on conflict (name) do update
set name = func.name
CONTEXT: PL/pgSQL function func(text) line 3 at SQL statement
完全列名をとして指定しようとしましたが
create or replace function func(
name text
) returns void language plpgsql as
$$
begin
insert into test (name) values (name)
on conflict ((test.name)) do -- this fails too
update set name = func.name;
end;
$$;
をしかし、それは同様に失敗します:コンパイルされません、または((test.name))
コンパイルどのソリューションは
select * from func('two');
ERROR: invalid reference to FROM-clause entry for table "test"
LINE 2: on conflict ((test.name)) do
^
HINT: There is an entry for table "test", but it cannot be referenced from this part of the query.
QUERY: insert into test (name) values (name)
on conflict ((test.name)) do
update set name = func.name
CONTEXT: PL/pgSQL function func(text) line 3 at SQL statement
ありますか?
編集:test_pkey
は、テーブル名プラス_pkey
です
on conflict on constraint test_pkey do update
:私は回避策を見つけました。私はそれがいかに信頼できるか分かりません。私はまだ代わりに列名を指定したいと思います。
なぜですか?私はOPのコードを編集しました。 –
@IMSoP私はちょっと精巧な答えを出しました - もっと理解できますか? –
素晴らしい!興味のない場合は、 '#variable_conflict'ルールを適用すると、'((name)) 'の余分な括弧が必要ですか?'(name) 'も同様ですか?マニュアルを読むと、余分な角括弧が "インデックスの列名"ではなく "インデックス式"を指定しているように見えますが、これが名前解決に何らかの違いをもたらすのではないかと思います。 – IMSoP