只有在执行功能时才会出现错误键已经存在的情况

问题描述 投票:0回答:1

我有两张表,在一张表中我创建一个元素,在另一张表中我用不同的语言保存该元素的细节。

第一张表:

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)
)

我用一个函数在lpgsql中插入新的元素。

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;

但它提出一个错误,说关键约束条件(idelement,语言)已经存在。

简单地复制出现在错误信息中的SQL,然后在另一个窗口中执行它,就不会有任何问题,问题只出现在pgsql函数中。

EDIT: 我要补充的是,这个方法是可行的,直到我注意到一个问题,我让人们在语言iso中插入大写或小写,所以我强迫语言总是大写,从那时起,我得到了错误信息。

postgresql key plpgsql postgresql-9.6
1个回答
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都被执行了,引起了错误。

© www.soinside.com 2019 - 2024. All rights reserved.