【发布时间】:2018-09-28 12:06:42
【问题描述】:
这是我的 3 张桌子。
Service (Serviceid,service_type,sname,ratings,address,due_date,company)
Hotel (hotelid,address,ratings,hotel_name,cityid)
Insurance(insuranceid,company,due_date)
每当在 Hotel 表中进行插入时,其 hotelanme、ratings、address、hotelid 也应输入到 Service 表中。
INSERT INTO HOTEL VALUES(NEXTVAL('HOTELSQ'),'123,APPLE STREET',5.0,'GRAND BHAGVATI HOTEL',1003);
这是我在 postgres 中的触发器代码。
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
并且没有输入记录..
我为保险表做了同样的事情。在保险表中添加一条记录也将在服务表中插入记录,它已经成功完成。 但是酒店的桌子还在..
【问题讨论】:
-
也许您已经有一个 serviceid=3524 的条目?
-
不,它说它有条目,但是服务表有带有保险ID的条目,因为每当我添加保险记录时,它都会成功插入服务表,但酒店条目没有插入服务表。
-
将
hotelid保存为serviceid听起来不对。您确定不想将serviceID作为一个序列,并且每个service行都包含一个不唯一的hotelid,它是hotel表的外键吗? (即它使每家酒店能够提供超过 1 项服务) -
啊,所以你正在使用两个序列来喂一张桌子,现在它们已经发生了碰撞。您需要审查您的设计
-
那么您不能对酒店使用一个序列,而对保险使用另一个序列。您可以使用 1 个 serviceSequence 来提供所有表(但同样,这听起来是错误的,即使是简单的语言)
标签: postgresql triggers insert