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

Batas Kedalaman Stack terlampaui di PostgresQL (After Delete Trigger)

Sejauh ini Anda itulah yang terjadi:

  1. Hapus anak1.
  2. Memicu penghapusan induk.
  3. Menghapus n saudara kandung anak1 dengan DELETE CASCADE .
  4. Memanggil pemicu yang sama n kali.
  5. Tidak ada lagi saudara kandung yang tersisa.

Tidak ada putaran tanpa akhir, tetapi tetap n panggilan dari pemicu. Itu bisa menjelaskan mengapa batas kedalaman tumpukan Anda terlampaui, tetapi Anda bisa memperbaikinya dengan meningkatkan batas. Hal yang sama dapat terjadi lagi dengan n greater yang lebih besar .

Sebagai alternatif, ganti pemicu Anda dengan:

CREATE OR REPLACE FUNCTION delete_family()
  RETURNS TRIGGER AS
$func$
BEGIN
    DELETE FROM child  WHERE parent_id = OLD.parent_id;
    DELETE FROM parent WHERE parent_id = OLD.parent_id;  -- done after 1st call
    RETURN NULL;
END
$func$ LANGUAGE plpgsql;  -- don't quote the language name!

CREATE TRIGGER delete_family
AFTER DELETE ON child 
FOR EACH ROW EXECUTE PROCEDURE delete_family();

Dan ganti batasan FK dengan versi tanpa ON DELETE CASCADE . Contoh kode:

Sekarang, untuk DELETE seluruh keluarga, Anda tidak dapat menghapus orang tua seperti sebelumnya (sekarang dilarang oleh FK). Alih-alih DELETE anak mana pun.

Harus lebih cepat juga.




  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:masukkan dari tabel lain

  2. PostgreSQL:Menampilkan tabel di PostgreSQL

  3. Bagaimana cara mengganti database di postgres?

  4. Memanggil perintah psql pg_dump dalam skrip batch

  5. Batas postgresql oleh grup N