PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Задействане за изтриване на редове от свързани таблици преди изтриване на редове от действителната таблица

Още няколко съвета относно вашата функция за задействане:

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;

Основни точки

  • Вашата проверка за съществуване с SELECT изявление удвоява разходите. Просто стартирайте DELETE , ако не бъде намерен съответстващ ред, нищо не се изтрива.

  • Използвайте CASE изявление тук. По-кратко, по-бързо. Обърнете внимание, че plpgsql CASE е малко по-различен от SQL CASE изявление. Например, можете да изброите няколко случая наведнъж.

  • Нямате нужда от DECLARE ключова дума, освен ако всъщност не декларирате променливи.

Алтернативен дизайн

Бихте могли да избегнете проблема като цяло чрез каскадни изтривания чрез външен ключ , като @a_horse, споменат в коментара . Оформлението на моята схема ще изглежда така:

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

...

Относно serial :
Автоматично нарастване на 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. Еквивалент на параметър с таблица в Postgresql

  2. Как да приложим връзка много към много в PostgreSQL?

  3. Как да създадете потребител с pgAdmin

  4. Autocommit във Flask-SQLAlchemy

  5. Свържете се с отдалечен postgresql сървър на Amazon ec2