为什么这段代码似乎一切正常,却给我带来错误?

时间:2018-09-28 12:06:43

标签: postgresql triggers insert

这是我的3张桌子。

Service  (Serviceid,service_type,sname,ratings,address,due_date,company)
Hotel    (hotelid,address,ratings,hotel_name,cityid)
Insurance(insuranceid,company,due_date)

每当在“酒店”表中进行插入时,都应在“服务”表中输入其酒店名,等级,地址,酒店ID。

INSERT INTO HOTEL VALUES(NEXTVAL('HOTELSQ'),'123,APPLE STREET',5.0,'GRAND BHAGVATI HOTEL',1003);

这是我在postgres中的Trigger代码。

CREATE OR REPLACE FUNCTION INSERTFORHOTEL()
RETURNS TRIGGER AS 
$$
BEGIN
INSERT INTO SERVICE(SERVICEID,SNAME,SERVICE_TYPE,RATINGS,ADDRESS) VALUES (NEW.HOTELID,NEW.HOTEL_NAME,'HOTEL',NEW.RATINGS,NEW.ADDRESS);
RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER INSERTHOTEL BEFORE INSERT ON HOTEL
FOR EACH ROW EXECUTE PROCEDURE INSERTFORHOTEL();

触发器成功运行,但是当我插入上面输入的记录时,会出现以下错误。

ERROR:  duplicate key value violates unique constraint "service_pkey"
DETAIL:  Key (serviceid)=(3524) already exists.
CONTEXT:  SQL statement "INSERT INTO SERVICE(SERVICEID,SNAME,SERVICE_TYPE,RATINGS,ADDRESS) VALUES (NEW.HOTELID,NEW.HOTEL_NAME,'HOTEL',NEW.RATINGS,NEW.ADDRESS)"
PL/pgSQL function insertforhotel() line 3 at SQL statement
SQL state: 23505

未输入记录。

我对保险表做了同样的事情。在保险表中添加记录也会在服务表中插入记录,这已成功完成。 但是旅馆的桌子还剩下。.

1 个答案:

答案 0 :(得分:1)

如果hotelinsurance的触发代码相同,那么您可能会有冲突的概念。

您正在将INSURANCE_ID作为SERVICE_ID以及HOTEL_ID作为SERVICE_IDINSURANCE_IDHOTEL_ID都是序列。因此,如果insurance表中有新的第42行,则要将42作为SERVICE_ID添加到service表中。但是,如果您在hotel表中获得第42行,则会遇到问题,因为您无法再将第42行作为SERVICE_ID添加到表中。您的insurance输入中已经存在。这是唯一的约束冲突。

您最好不要将ID复制为新的SERVICE_ID。创建自己的SERVICE_ID列(键入serial-或使用 Postgres 10 及更高版本GENERATED AS IDENTITY),然后可以将其他ID用作参考没有唯一约束的独立列。