PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak sprawić, by PostgreSQL wstawiał wiersz do tabeli po usunięciu z innej tabeli?

Napisz funkcję wyzwalającą. Coś takiego:

CREATE OR REPLACE FUNCTION trg_backup_row()
  RETURNS trigger AS
$BODY$
BEGIN

INSERT INTO other_tbl
SELECT (OLD).*, t.other_col                -- all columns of from old table
-- SELECT OLD.col1, OLD.col2, t.other_col  -- alternative: some cols from old tbl
FROM   third_tbl t
WHERE  t.col = OLD.col  -- link to third table with info from deleted row
AND    <unique_condition_to_avoid_multiple_rows_if_needed>;

RETURN NULL;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

I wyzwalacz ON DELETE . Tak:

CREATE TRIGGER delaft
  AFTER DELETE
  ON tbl
  FOR EACH ROW
  EXECUTE PROCEDURE trg_backup_row();

Kluczowe elementy

  • Najlepiej, aby był to wyzwalacz PO USUNIĘCIU i DLA KAŻDEGO WIERSZU .

  • Aby zwrócić wszystkie kolumny ze starej tabeli, użyj składni (OLD).* . Zobacz instrukcję dotyczącą dostępu do typów złożonych . Alternatywnie STARY.* jest również poprawną składnią, ponieważ STARY jest dodawany do FROM klauzula niejawnie. Dla WARTOŚCI wyrażenie musiałoby być (STARY).* , chociaż. Na przykład:

    INSERT INTO other_tbl
    VALUES((OLD).*, some_variable)
    
  • Możesz dołączyć wartości z dowolnej innej tabeli, jak pokazuję. Upewnij się tylko, że otrzymasz jeden wiersz lub utworzysz wiele wpisów.

  • Gdy wyzwalacz odpala PO zdarzenie, funkcja może RETURN NULL .

Informacje o widoczności

W odpowiedzi na uważny komentarz @couling.

Klucze obce mogą być deklarowane jako DEFERRED , odroczy to tylko sprawdzenie integralności, a nie samo usunięcie. Wiersze, które są usuwane w wyzwalaczach wykonanych przed tym, który jest pod ręką lub przez PO USUNIĘCIU KASKADY klucze obce nie będą już widoczne w tym czasie to PO USUNIĘCIU wywoływany jest wyzwalacz. (Oczywiście wszystko dzieje się w jednej transakcji. Żadne z tych szczegółów nie mają znaczenia dla innych transakcji, w których zauważą się wszystkie lub żadne efekty. Więcej informacji na temat Izolacja modelu MVCC i transakcji .)

Dlatego jeśli chcesz uwzględnić wartości z wierszy zależnych w taki sposób w swoim INSERT , pamiętaj, aby wywołać ten wyzwalacz przed te wiersze zostaną usunięte.

Być może będziesz musiał uruchomić ten wyzwalacz PRZED USUNIĘCIEM .

Lub może to oznaczać, że musisz odpowiednio uporządkować wyzwalacze, PRZED wyzwalacze pojawiają się przed PO oczywiście wyzwalacze. A wyzwalacze na tym samym poziomie są wykonywane w kolejności alfabetycznej .

Jednak tak długo, jak jestem tutaj super precyzyjny, mogę również dodać, że zmiany wprowadzone w wierszu (lub wierszach zależnych) w innych PRZED wyzwalacze są również widoczne tylko wtedy, gdy są wywoływane przed ten.

Moja rada, aby to było PO wyzwalacz był mniej podatny na komplikacje i tańszy, jeśli inny wyzwalacz może anulować (cofnąć) DELETE w połowie operacji - o ile żadne z powyższych nie ma zastosowania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Niestandardowy numer tygodnia PostgreSQL - pierwszy tydzień zawierający 1 lutego

  2. Czy można zastąpić serwer proxy Cloud SQL serwerem proxy Istio?

  3. postgres do MS Access

  4. Dołącz do trzech stołów, z których jeden nie ma klucza podstawowego

  5. GROUP BY i COUNT w PostgreSQL