【问题标题】:Error key already exists appears only while executing function错误键已存在仅在执行功能时出现
【发布时间】:2020-06-08 14:00:22
【问题描述】:

我有两张表,一张我创建一个元素,另一张我用不同的语言保存所述元素的详细信息。

第一张桌子:

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;

但它会引发一个错误,说明键约束(idelement、语言)已经存在。

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

编辑:我会补充说,这一直有效,直到我注意到我让人们以大写或小写形式插入语言 iso 的问题,所以我强制语言始终为大写,从那时起我收到错误消息。

【问题讨论】:

    标签: postgresql key plpgsql postgresql-9.6


    【解决方案1】:

    我发现了问题:

    在那句话之后我又做了一个

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 2020-12-01
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多