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

postgres. plpgsql stakdybdegrænsen er overskredet

Ok, hvis du virkelig vil have triggeren ved opdatering, hvad du kunne gøre, så sæt denne trigger som kolonnespecifik, så den ikke udløses ved en opdatering til all_books , som forårsager din rekursion. Noget som dette -

create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();

Du kan selvfølgelig ændre hvilke kolonner der udløser funktionen, jeg valgte bare copy_id fordi det er det, du tæller.

DOG

Hvis du opdaterer med en count() resultat, kan du bare sætte udløseren på INSERT og DELETE handlinger. På denne måde udløses triggeren, når tællingen ændres, men den udløses ikke selv af opdateringen. // EDIT:Siden din sum er kun en optælling af alle poster i copies , det vil kun ændre sig, når en post er indsat eller opdateret, så det ville alligevel ikke give mening at køre denne trigger ved opdatering.

EDIT:Jeg tænkte, at det ville være nyttigt at tilføje et link til CREATE TRIGGER-dokumentation . Se afsnittet mærket "begivenhed", fordi dette beskriver, hvordan du angiver kolonner i begivenheden.

REDIGER TIL NYE OPLYSNINGER:

I betragtning af, hvad det lyder som om, du skal opnå, tror jeg, du skal genoverveje dit datadesign. Jeg foreslår, at du bruger en forældre-barn-relation (hver gang du cachelagrer delte data på mange rækker i en tabel, fordi de deler noget til fælles, at er et tegn på, at du måske har brug for et forældrebord i stedet).

Har en books tabel, hvor hver række er information om én bog (titel, forfatter osv.), og derefter har en copies tabel, hvor hver række indeholder oplysninger om et eksemplar af en bog (serienummer, sidst tjekket ud osv.).

På den måde er det så enkelt at få antallet af kopier som SELECT COUNT(*) FROM copies WHERE book_id=[some book id] .

Hvis du virkelig vil cache tællingen et sted, så gør det på books bord.

Opret en INSERT OR UPDATE trigger på copies der gør UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id .

Opret derefter en DELETE trigger på kopier, der gør UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id

Årsagen til to triggere er, at NEW variabel er kun tilgængelig i INSERT eller UPDATE triggere og OLD er kun tilgængelig i DELETE udløser. Du kan gøre det hele som én udløser, men det kræver mere kode, end jeg ville sætte her.

Sørg for, at alle dine triggere er AFTER udløses, ellers vil en nyligt indsat/slettet række ikke blive taget med i tællingen.



  1. Sådan vælger du kolonneværdi som kolonnenavn med betingelser i SQL-tabel

  2. MySQL:Valg af flere felter til flere variabler i en lagret procedure

  3. Tilføj automatisk stigning til eksisterende kolonne uden at påvirke aktuelle postværdier

  4. MySQL-lagret proceduremarkør til forberedte udsagn