2012-09-10 27 views
11

Tôi có một bảng có tên là giải thưởng. Làm thế nào tôi có thể gắn kết Trình kích hoạt trong PostgreSQL trong đó mỗi lần chèn trong bảng giải thưởng cập nhật một bảng khác?Chèn trình kích hoạt để cập nhật bảng khác bằng cách sử dụng PostgreSQL

+1

Ông có thể cung cấp một số mor e chi tiết? Đây có phải là "bảng khác", một bảng riêng biệt hay nhiều bảng dựa trên một số giá trị của một số trường trong phần thưởng. – jcater

+2

http://www.postgresql.org/docs/8.1/static/triggers.html – ertx

+2

@ertx Tốt hơn để liên kết đến/current/doc thay vì /8.1/ doc, đó là * cực kỳ * lỗi thời. –

Trả lời

4

Bạn muốn số documenation for PL/PgSQL triggers, trong đó thảo luận về trường hợp này trong số những trường hợp khác. Tổng quan documentation on triggers cũng có thể hữu ích.

Bạn có thể sử dụng kích hoạt BEFORE hoặc AFTER cho việc này. Tôi có thể sử dụng một kích hoạt AFTER để kích hoạt của tôi thấy phiên bản cuối cùng của hàng được chèn vào, mặc dù. Bạn muốn FOR EACH ROW, tất nhiên.

+0

Hey @ Craig Ringer là mục đích của FOR EACH ROW cho các đợt chèn? – rosenthal

+1

@rosenthal Huh? Các trình kích hoạt 'FOR EACH STATEMENT' không có quyền truy cập vào hàng' NEW'. Vì vậy, ngay cả khi bạn đang làm một hàng duy nhất 'INSERT' nó sẽ không hữu ích cho việc này. –

+0

Tôi không có ý đó, tha thứ cho sự lựa chọn tội nghiệp của tôi bằng lời nói. Ý tôi là FOR EACH ROW làm gì? Tôi đã xem tài liệu cho Postgres và hiểu nó ngay bây giờ. "Một kích hoạt được đánh dấu CHO M EI ROW được gọi một lần cho mỗi hàng mà các hoạt động sửa đổi." – rosenthal

25

Ở đây chúng ta có hai bảng tên table1table2. Sử dụng trình kích hoạt, tôi sẽ cập nhật table2 khi chèn vào table1.

Tạo các bảng

CREATE TABLE table1 
(
    id integer NOT NULL, 
    name character varying, 
    CONSTRAINT table1_pkey PRIMARY KEY (id) 
) 

CREATE TABLE table2 
(
    id integer NOT NULL, 
    name character varying 
) 

cò Chức năng

CREATE OR REPLACE FUNCTION function_copy() RETURNS TRIGGER AS 
$BODY$ 
BEGIN 
    INSERT INTO 
     table2(id,name) 
     VALUES(new.id,new.name); 

      RETURN new; 
END; 
$BODY$ 
language plpgsql; 

CREATE TRIGGER trig_copy 
    AFTER INSERT ON table1 
    FOR EACH ROW 
    EXECUTE PROCEDURE function_copy(); 
+0

Trong kích hoạt Chức năng như thế nào das nó biết để chèn các giá trị từ bảng một? Chúng ta không cần phải viết "từ table1" sau "giá trị (new.id, new.name)"? –

Các vấn đề liên quan