我有两张表,在一张表中我创建一个元素,在另一张表中我用不同的语言保存该元素的细节。
第一张表:
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中插入大写或小写,所以我强迫语言总是大写,从那时起,我得到了错误信息。
我发现了问题。
就在这句话之后,我有另一条
IF _idelement > 0 THEN
EXECUTE FORMAT('INSERT INTO elementdetails(idelement, %I, language) VALUES (%L, %L, %L))', _fieldname, _idelement, _value, _language);
END IF;
但我忘了把它放在ELSE后面,所以两个INSERT都被执行了,引起了错误。