错误键已经存在,仅在执行功能时出现

时间:2020-06-08 14:00:22

标签: postgresql key plpgsql postgresql-9.6

我有2个表,一个表中创建一个元素,另一个表中以不同的语言保存该元素的详细信息。

第一张桌子:

CREATE TABLE public.element
(
  idelement integer NOT NULL DEFAULT nextval('element_idelement_seq'::regclass),
  image_location text,
  price numeric(6,2) NOT NULL DEFAULT 0,
  CONSTRAINT element_pkey PRIMARY KEY (idelement)
)

第二张桌子:

CREATE TABLE public.elementdetails
(
  idelement integer NOT NULL,
  title text,
  description text,
  notes text,
  language text NOT NULL,
  CONSTRAINT elementdetails_pkey PRIMARY KEY (idelement, language)
)

我使用函数在plpgsql中插入新元素

IF _idelement = 0 THEN
    INSERT INTO element (price) VALUES (0.0);
    SELECT lastval() INTO _idelement;
    EXECUTE FORMAT('INSERT INTO elementdetails(idelement, %I, language) VALUES (%L, %L, %L))', _fieldname, _idelement, _value, _language);
END IF;

但是会引发一个错误,指出关键约束(要素,语言)已经存在。

仅复制出现在错误消息中的SQL并在另一个窗口中执行它就不会出现问题,并且该问题仅在pgsql函数中出现。

编辑:我要补充一点,这一直有效,直到我注意到一个让人们以大写或小写形式插入iso的问题为止,所以我强迫该语言始终为大写,因为这样我得到了错误消息。 / p>

1 个答案:

答案 0 :(得分:0)

我发现了问题:

那句话之后,我还有另一句话

IF _idelement > 0 THEN
    EXECUTE FORMAT('INSERT INTO elementdetails(idelement, %I, language) VALUES (%L, %L, %L))', _fieldname, _idelement, _value, _language);
END IF;

但是我忘了把它放在ELSE之后,所以执行了两个INSERT都会引发错误。

相关问题