Ich benutze häufig variable_conflict use_variable, und bis jetzt hatte ich noch nie irgendwelche Probleme damit. Es funktioniert jedoch nicht mit ON CONFLICT
Klausel von UPSERT
. Hier ist meine Repro:Funktioniert variable_conflict use_variable nicht mit ON CONFLICT-Klausel von UPSERT?
CREATE TABLE test(id serial not null,
CONSTRAINT test_pk PRIMARY KEY(id),
category_id INT NOT NULL,
tname TEXT NOT NULL,
CONSTRAINT test_unq UNIQUE(category_id, tname),
some_info TEXT NOT NULL);
CREATE OR REPLACE FUNCTION insert_test(category_id INT, tname TEXT, some_info TEXT)
RETURNS void AS
$BODY$
#variable_conflict use_variable
DECLARE
resultId INTEGER;
BEGIN
INSERT INTO test(category_id, tname, some_info)
SELECT category_id, tname, some_info
ON CONFLICT(category_id, tname) DO NOTHING;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
SELECT insert_test(1, 'Colors', 'Blue');
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
CONTEXT: SQL statement "INSERT INTO test(category_id, tname, some_info)
SELECT category_id, tname, some_info
ON CONFLICT(category_id, tname) DO NOTHING"
Ohne #variable_conflict use_variable alles funktioniert:
CREATE OR REPLACE FUNCTION insert_test2(p_category_id INT, p_tname TEXT, p_some_info TEXT)
RETURNS void AS
$BODY$
DECLARE
resultId INTEGER;
BEGIN
INSERT INTO test(category_id, tname, some_info)
SELECT p_category_id, p_tname, p_some_info
ON CONFLICT(category_id, tname) DO NOTHING;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
SELECT insert_test2(1, 'Colors', 'Blue');
SELECT insert_test2(2, 'Colors', 'Red');
Was bin ich?
Sie sollten das in die Postgres (Bugs-) Mailing-Liste veröffentlichen. Aber im Allgemeinen ist es nicht empfehlenswert, Parameter zu verwenden, die sowieso den gleichen Namen wie Spalten haben. Daher sehe ich das Problem hier nicht. –