【问题标题】:PostgreSQL Trigger on Insert or UpdatePostgreSQL 插入或更新触发器
【发布时间】:2013-01-24 04:43:07
【问题描述】:

我有两张桌子。我想在car 表上创建一个触发器,它将根据某个值在fuel 表上插入或删除。

汽车

id - SERIAL
fuel - BOOLEAN

燃料

car_id -  INTEGER

我没有包含任何行数据,因为触发器的描述不需要它。

基本上,我想在Car 表上创建一个触发器:

  • 在插入或更新时运行。
  • 如果Car.fuel is true,则将Car.id 插入Fuel 表中。
  • 如果是Car.fuel is false,触发器应该删除Fuel表中Fuel.car_id = Car.id所在的所有行。

我该怎么做?

编辑:澄清我正在使用 Postgres

【问题讨论】:

  • 我一直认为 PSQL 是 Postgres 的标识符。但是是的,我使用的是 postgres :)
  • psql 主要是 Postgres 的缩写,这是真的。但它也可能是一个错字,意思是PL/PSQL(这是Oracle 的程序语言)。 Postgres 的过程语言称为PL/pgSQL
  • 有很多问题需要处理。如果有更新,应该触发什么,这不会改变“燃料”的值。 id变了怎么办?如果更新前或更新后的燃料为空,该怎么办?

标签: sql postgresql triggers constraints


【解决方案1】:

由于您没有提到 RDBMS,我假设它是 Oracle。下面是触发器。如果您使用的是其他 RDBMS,请调整代码以适应语法。

CREATE OR REPLACE TRIGGER TRG_CAR
   AFTER INSERT OR UPDATE ON CAR
   FOR EACH ROW

   BEGIN

     IF :new.FUEL THEN
       INSERT INTO FUEL (CAR_ID) VALUES (:new.ID);
     ELSE
       DELETE FROM FUEL WHERE CAR_ID = :new.ID;
     END IF;
   END;

【讨论】:

  • 我认为IF :new.FUEL THEN 不会在 Oracle 中工作,因为它没有 BOOLEAN SQL 数据类型(只有 PL/SQL 有)。所以:NEW 记录不能有布尔列。我实际上认为 Ozzy 正在使用 Postgres(psql 是 Postgres 的命令行工具)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
相关资源
最近更新 更多