postgresql - 为什么这段代码给我错误,尽管一切似乎都是正确的?

标签 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)

每当在 Hotel 表中进行插入时,其 hotelanme、评级、地址、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

记录没有输入..

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

最佳答案

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

您正在将 INSURANCE_ID 添加为 SERVICE_ID,并将 HOTEL_ID 添加为 SERVICE_IDINSURANCE_IDHOTEL_ID 都是序列。因此,如果 insurance 表中有一个新的行 42,您将把 42 作为 SERVICE_ID 添加到 service 表中。但是,如果您将第 42 行放入 hotel 表中,就会遇到问题,因为您无法再将 42 作为 SERVICE_ID 添加到您的表中。它已经存在于您的 insurance 输入中。这是违反唯一约束的情况。

您最好不要将您的 ID 复制为新的 SERVICE_ID。创建一个自己的 SERVICE_ID 列(类型 serial - 或者在 Postgres 10 和更高版本的情况下 GENERATED AS IDENTITY )然后你可以使用其他 ID作为对没有唯一约束的单独列的引用。

关于postgresql - 为什么这段代码给我错误,尽管一切似乎都是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52554976/

相关文章:

mysql - 在 rake 任务中打开与 mysql 数据库的连接

mysql - 将 IN 子查询的结果插入到单独的列中

ruby-on-rails - 环境变量不加载 Rails

ruby - 将 `gem ' pg'` 添加到您的 Gemfile 并确保其版本处于 ActiveRecord 所需的最低版本

postgresql - 对函数返回的记录集进行排序

Mysql触发器空结果

sql - T-SQL:在修改事务结束之前运行的触发器

mysql - 使用mysql更新触发器

hadoop - hive插入和加载数据的区别

php - 插入具有运行余额的行