sql >> Databasteknik >  >> RDS >> PostgreSQL

Utlösare för att ta bort rader från relaterade tabeller innan rader tas bort från den faktiska tabellen

Några fler 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;

Huvudpunkter

  • Din kontroll av existens med en SELECT uttalande fördubblar kostnaden. Kör bara DELETE , om ingen matchande rad hittas raderas ingenting.

  • Använd en CASE uttalande här. Kortare, snabbare. Observera att plpgsql CASE skiljer sig något från SQL CASE påstående. Du kan till exempel lista flera fall samtidigt.

  • Du behöver inte DECLARE nyckelord, såvida du inte faktiskt deklarerar variabler.

Alternativ design

Du kan undvika problemet helt och hållet genom att kaskadradering via främmande nyckel , som @a_horse som nämns i kommentaren . Min schemalayout skulle se ut så här:

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 ökning av SQL-funktion



  1. Hur man returnerar exempelrad från databasen en efter en

  2. CREATE FUNCTION-fel Denna funktion har ingen av DETERMINISTISK, INGEN SQL eller READS SQL DATA

  3. Synkronisera 2 tabeller av olika databaser - MySQL

  4. Hur krymper jag min SQL Server-databas?