sql >> Database teknologi >  >> RDS >> PostgreSQL

Udløser for at slette rækker fra relaterede tabeller før sletning af rækker fra den faktiske tabel

Nogle flere råd om din triggerfunktion:

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;

Vigtige punkter

  • Din kontrol for eksistens med en SELECT erklæring fordobler omkostningerne. Bare kør DELETE , hvis der ikke findes en matchende række, slettes intet.

  • Brug en CASE udtalelse her. Kortere, hurtigere. Bemærk at plpgsql CASE er lidt anderledes end SQL CASE udmelding. Du kan f.eks. liste flere sager på én gang.

  • Du behøver ikke DECLARE søgeord, medmindre du faktisk erklærer variabler.

Alternativt design

Du kan undgå problemet helt ved at kaskadesletninger via fremmednøgle , som @a_horse nævnt i kommentaren . Mit skemalayout ville se sådan ud:

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
);

...

Om serial :
Automatisk inkrementering af SQL-funktion



  1. Sådan udlignes en HTML-tabel med PHP for at trække celleværdien af ​​1. række fra 2. rækkes celleværdi i forskellige kolonner

  2. SQL Server Float-datatypeberegning vs. decimal

  3. Hvis der findes opdatering ellers, indsæt i én forespørgsel

  4. Dato og tid i 24 timers format