ОШИБКА: двойное значение ключа нарушает ограничение уникального текста - PullRequest
0 голосов
/ 21 сентября 2018

у меня есть таблица 'A', которая выглядит следующим образом:

 key |   name
-----+-----------------------
 aa  | AName
 bb  | BName
 cc  | CName

другая таблица 'B', которая выглядит следующим образом

P_name | p_key | key
-----+-------+-----
dd   | 1801  | aa
ee   | 1108  | aa

это полная функция

 CREATE OR REPLACE FUNCTION add_B( p_name text, p_key varchar(9), key char(2), name text )
 RETURNS boolean AS $$
 DECLARE
    did_insert boolean := false;
    found_count integer;
    the_key text;
    the_name text;
 BEGIN

SELECT a.key INTO the_key
FROM A a
WHERE a.key = the_key
LIMIT 1;

IF the_key IS NULL THEN
        INSERT INTO A (key, name)
        VALUES (key, name)
        RETURNING add_B.key INTO the_key;
        did_insert := true;
 END IF;

RAISE NOTICE 'A is found %', the_key;
    INSERT INTO B (p_name, p_key, key)
    VALUES (p_name, p_key, key);

    RETURN did_insert;
END;
$$ LANGUAGE plpgsql;

проблема в том, что всякий раз, когда я запускаю

SELECT add_key('newname','p_key','aa','AName');

, он возвращает

ОШИБКА: значение дублированного ключа нарушает уникальное ограничение "A_pkey"

Как мне поступить с этой ошибкой?

1 Ответ

0 голосов
/ 21 сентября 2018

the_key равно нулю, поэтому вы, вероятно, имеете в виду некоторую другую переменную в предложении WHERE для ниже SELECT:

SELECT a.key INTO the_key
FROM A a
WHERE a.key = the_key
LIMIT 1;

Вы, вероятно, должны перефразировать ее в:

SELECT A.key INTO the_key
FROM A
WHERE A.key = key -- note the change of variable here
LIMIT 1;

Тогда,ваш оператор INSERT должен также включать вашу таблицу, поэтому добавьте ее

INSERT INTO A (key, name) ...

Вы можете либо указать, откуда берется значение, с помощью псевдонима типа add_B.name, как вы это сделали, либо просто использовать переменную настройку поведения для этогофункционировать так:

CREATE FUNCTION ...
#variable_conflict use_variable -- add this
DECLARE
...
...