Mam tabelę o nazwie nagrody. Jak zamontować Trigger w PostgreSQL, gdzie każda wstawka w tabeli nagradza inną tabelę?Wstaw wyzwalacz, aby zaktualizować inną tabelę, używając PostgreSQL
Odpowiedz
Chcesz documenation for PL/PgSQL triggers, który omawia właśnie ten przypadek między innymi. Ogólny numer documentation on triggers również może być przydatny.
Można użyć do tego wyzwalacza BEFORE
lub AFTER
. Prawdopodobnie użyłbym spustu AFTER
, więc mój spust zobaczył ostateczną wersję wstawianego wiersza. Oczywiście, chcesz mieć FOR EACH ROW
.
Hej @Craig Ringer jest celem FOR EACH ROW dla insertów wsadowych? – rosenthal
@rosenthal Huh? Wyzwalacze "DLA KAŻDEGO STATYSTYKA" nie mają dostępu do wiersza 'NEW'. Więc nawet gdybyś robił pojedynczy wiersz 'INSERT', nie byłby do tego użyteczny. –
Nie miałem na myśli tego, przepraszam za mój zły wybór w słowach. Mam na myśli to, co robią FOR EACH ROW? Spojrzałem na dokumentację Postgres i teraz to rozumiem. "Wyzwalacz oznaczony DLA KAŻDEGO WIERSZA jest wywoływany raz dla każdego wiersza, który modyfikuje operacja." – rosenthal
Kliknij poniższy link, aby uzyskać odpowiedź.
http://www.postgresql.org/docs/9.4/static/plpgsql-trigger.html
Tutaj mamy dwie tabele nazwanych table1
i table2
. Za pomocą spustu zaktualizuję table2
po wstawieniu do table1
.
Tworzenie tabel
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
)
Funkcja wyzwalania
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;
Trigger
CREATE TRIGGER trig_copy
AFTER INSERT ON table1
FOR EACH ROW
EXECUTE PROCEDURE function_copy();
W wyzwalaczu Funkcja, jak wie, wstawić wartości z pierwszej tabeli? Czy nie musimy pisać "z tabeli 1" po "wartościach (new.id, new.name)"? –
mógłbyś podać kilka mor e szczegóły? Czy ta "inna tabela" jest pojedynczą, oddzielną tabelą lub wieloma tabelami opartymi na wartości niektórych pól w nagrodach. – jcater
http://www.postgresql.org/docs/8.1/static/triggers.html – ertx
@ertx Lepiej połączyć z/current/doc zamiast/8.1/doc, to jest * bardzo * nieaktualne. –