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

Uruchom, aby usunąć wiersze z powiązanych tabel przed usunięciem wierszy z rzeczywistej tabeli

Kilka dodatkowych porad dotyczących funkcji wyzwalania:

CREATE OR REPLACE FUNCTION delete_question()
  RETURNS trigger AS
$func$
BEGIN

CASE OLD.que_type
WHEN 1 THEN
    DELETE FROM mcq   WHERE que_id=OLD.id;
WHEN 2, 3 THEN
    DELETE FROM tffb  WHERE que_id=OLD.id;
WHEN 4 THEN
    DELETE FROM essay WHERE que_id=OLD.id;
-- ELSE
--      Do something?
END CASE;

RETURN OLD;

END
$func$ LANGUAGE plpgsql;

Główne punkty

  • Twój czek na istnienie za pomocą SELECT oświadczenie podwaja koszt. Po prostu uruchom DELETE , jeśli nie zostanie znaleziony pasujący wiersz, nic nie zostanie usunięte.

  • Użyj CASE oświadczenie tutaj. Krótszy, szybszy. Zauważ, że plpgsql CASE różni się nieco od SQL CASE oświadczenie. Na przykład możesz wymienić kilka spraw jednocześnie.

  • Nie potrzebujesz DECLARE słowa kluczowego, chyba że faktycznie zadeklarujesz zmienne.

Alternatywny projekt

Możesz całkowicie uniknąć problemu, kaskadowe usuwanie za pomocą klucza obcego , jako @a_koń wspomniany w komentarzu . Mój układ schematu wyglądałby tak:

CREATE TABLE question (
   question_id serial NOT NULL PRIMARY KEY
  ,que_type    int   -- this may be redundant as well
);

CREATE TABLE essay (
   que_id int NOT NULL PRIMARY KEY
              REFERNECES question(question_id) ON UPDATE CASCADE
                                               ON DELETE CASCADE
  ,ans    text
);

...

Informacje o serial :
Funkcja automatycznej inkrementacji SQL



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wstawić do tabeli z innej tabeli, dopasowując wartości?

  2. Istnieje wiersz kontrolny Pythona psycopg2

  3. Zachowanie NOT LIKE z wartościami NULL

  4. Dołączanie do 2 dużych stołów postgres przy użyciu int8range nie skaluje się dobrze

  5. dobry klient postgresql dla systemu Windows?