这是我的三张桌子。
Service (Serviceid,service_type,sname,ratings,address,due_date,company)
Hotel (hotelid,address,ratings,hotel_name,cityid)
Insurance(insuranceid,company,due_date)
每当在酒店表中插入时,其hotelname、ratings、address、hotelid也应输入到服务表中。
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
且未输入记录。。
我对保险表也做了同样的事。在保险表中添加记录也会在服务表中插入记录,操作成功。
但酒店的桌子还剩下。。
最佳答案
如果两个的触发代码都相同,hotel
和insurance
则可能有一个冲突的概念。
您正在将INSURANCE_ID
添加为SERVICE_ID
以及HOTEL_ID
添加为SERVICE_ID
。INSURANCE_ID
和HOTEL_ID
都是序列。因此,如果在insurance
表中有一个新的行42,则将42 asSERVICE_ID
添加到service
表中。但是如果您在hotel
表中得到了第42行,那么您将遇到一个问题,因为您无法再将42作为SERVICE_ID
添加到表中。它已经存在于您的insurance
输入。这是唯一的约束冲突。
你最好不要把你的身份证复制成新的。创建一个自己的SERVICE_ID
列(键入SERVICE_ID
-或者在Postgres 10和更高serial
的情况下),然后您可以将其他id作为引用放入一个没有唯一约束的单独列中。
关于postgresql - 为什么这段代码虽然一切似乎正确,却给我带来错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52554976/