PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pemicu untuk menghapus baris dari tabel terkait sebelum menghapus baris dari tabel yang sebenarnya

Beberapa saran lagi tentang fungsi pemicu Anda:

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;

Poin utama

  • Periksa keberadaan Anda dengan SELECT pernyataan menggandakan biaya. Jalankan saja DELETE , jika tidak ada baris yang cocok ditemukan, tidak ada yang dihapus.

  • Gunakan CASE pernyataan di sini. Lebih pendek, lebih cepat. Perhatikan bahwa plpgsql CASE sedikit berbeda dari SQL CASE penyataan. Misalnya, Anda dapat membuat daftar beberapa kasus sekaligus.

  • Anda tidak memerlukan DECLARE kata kunci, kecuali jika Anda benar-benar mendeklarasikan variabel.

Desain alternatif

Anda dapat menghindari masalah sama sekali dengan penghapusan berjenjang melalui kunci asing , sebagai @a_horse disebutkan dalam komentar . Tata letak skema saya akan terlihat seperti ini:

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

...

Tentang serial :
Fungsi SQL peningkatan otomatis



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengubah posisi kolom dalam tabel database PostgreSQL?

  2. Apakah ada cara untuk membuat pg_dump mengecualikan urutan tertentu?

  3. Meratakan kolom JSONB bersarang Postgres

  4. Penerapan &Konfigurasi PostgreSQL dengan Wayang

  5. Postgresql. BUAT CAST 'bervariasi karakter' menjadi 'bilangan bulat'