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
Trả lời
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.
Hey @ Craig Ringer là mục đích của FOR EACH ROW cho các đợt chèn? – rosenthal
@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. –
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
Nhấp vào liên kết sau và bạn sẽ nhận được câu trả lời.
http://www.postgresql.org/docs/9.4/static/plpgsql-trigger.html
Ở đây chúng ta có hai bảng tên table1
và table2
. 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;
cò
CREATE TRIGGER trig_copy
AFTER INSERT ON table1
FOR EACH ROW
EXECUTE PROCEDURE function_copy();
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)"? –
Ô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
http://www.postgresql.org/docs/8.1/static/triggers.html – ertx
@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. –