2013-02-08 15 views
5

Tôi có hai bảng. Tôi muốn tạo ra một kích hoạt trên bảng car mà sẽ chèn hoặc xóa trên bảng fuel tùy thuộc vào một giá trị nhất định.Trình kích hoạt PostgreSQL trên Chèn hoặc Cập nhật

xe

id - SERIAL 
fuel - BOOLEAN 

Nhiên liệu

car_id - INTEGER 

Tôi không bao gồm bất kỳ dữ liệu hàng như mô tả của cò không cần nó.

Về cơ bản, tôi muốn tạo một kích hoạt trên bàn Car rằng:

  • Chạy trên một chèn hoặc cập nhật.
  • Chèn Car.id vào Fuel bảng nếu Car.fuel is true.
  • Nếu Car.fuel is false, trình kích hoạt sẽ xóa tất cả các hàng trong bảng Fuel trong đó Fuel.car_id = Car.id.

Tôi làm như thế nào?

EDIT: Để làm rõ tôi đang sử dụng Postgres

+0

Tham khảo http://plsql-tutorial.com/plsql-triggers.htm – asifsid88

+1

tôi luôn luôn giả định psql là định danh cho Postgres .. Nhưng yea Tôi đang sử dụng postgres :) – Ozzy

+0

'psql' chủ yếu là viết tắt của Postgres, đó là sự thật. Nhưng nó cũng có thể là một lỗi chính tả có nghĩa là "PL/PSQL' (đó là ngôn ngữ thủ tục của Oracle). Ngôn ngữ thủ tục của Postgres được gọi là 'PL/pgSQL' –

Trả lời

5

Vì bạn chưa đề cập đến RDBMS, tôi cho rằng đó là Oracle. Dưới đây là kích hoạt. Nếu bạn đang sử dụng RDBMS khác, hãy chỉnh sửa mã để phù hợp với cú pháp.

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; 
+0

Tôi không nghĩ rằng 'IF: new.FUEL THEN' sẽ làm việc trong Oracle vì nó không có kiểu dữ liệu BOOLEAN ** SQL ** (chỉ có PL/SQL). Vì vậy, bản ghi ': NEW' không thể có cột boolean. Tôi thực sự nghĩ Ozzy đang sử dụng Postgres ('psql' là công cụ dòng lệnh của Postgres) –