sql >> Database >  >> RDS >> PostgreSQL

postgres. plpgsql stapeldieptelimiet overschreden

Ok, als je echt de trigger bij update wilt, wat zou je kunnen doen om deze trigger in te stellen als kolomspecifiek, zodat deze niet wordt geactiveerd bij een update naar all_books , die uw recursie veroorzaakt. Zoiets -

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

Je kunt natuurlijk veranderen welke kolommen de functie activeren, ik heb gewoon copy_id gekozen want dat is wat je telt.

ECHTER

Als u bijwerkt met een count() resultaat, je kunt de trigger gewoon op INSERT . zetten en DELETE acties. Op deze manier wordt de trigger geactiveerd wanneer de telling verandert, maar wordt deze zelf niet geactiveerd door de update. // EDIT:sinds je sum is slechts een telling van alle records in copies , het zal alleen veranderen wanneer een record wordt ingevoegd of bijgewerkt, dus het zou toch geen zin hebben om deze trigger bij update uit te voeren.

EDIT:Ik dacht dat het handig zou zijn om een ​​link toe te voegen aan de CREATE TRIGGER-documentatie . Zie de sectie met het label "gebeurtenis", omdat hierin wordt beschreven hoe kolommen in het evenement moeten worden opgegeven.

BEWERKEN VOOR NIEUWE INFORMATIE:

Gezien wat het klinkt alsof je moet bereiken, denk ik dat je je gegevensontwerp moet heroverwegen. Ik raad je aan een ouder-kindrelatie te gebruiken (elke keer dat je gedeelde gegevens op veel rijen in een tabel cachet omdat ze iets gemeen hebben, dat is een teken dat u in plaats daarvan mogelijk een bovenliggende tabel nodig heeft).

Heb een books tabel waarin elke rij informatie bevat over één boek (titel, auteur, enz.), en heb dan een copies tabel waarin elke rij informatie bevat over één exemplaar van een boek (serienummer, laatst uitgecheckt, enz.).

Op die manier is het verkrijgen van het aantal exemplaren zo eenvoudig als SELECT COUNT(*) FROM copies WHERE book_id=[some book id] .

Als je de telling echt ergens in de cache wilt opslaan, doe dat dan in de books tafel.

Maak een INSERT OR UPDATE trigger op copies dat doet UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id .

Maak vervolgens een DELETE trigger op kopieën die UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id

De reden voor twee triggers is dat de NEW variabele is alleen beschikbaar in INSERT of UPDATE triggers, en OLD is alleen beschikbaar in DELETE triggers. Je zou het allemaal als één trigger kunnen doen, maar dat vereist meer code dan ik hier wilde plaatsen.

Zorg ervoor dat al je triggers AFTER zijn triggers, anders wordt een nieuw ingevoegde/verwijderde rij niet meegenomen in de telling.



  1. Er zijn geen inloggegevens beschikbaar in het beveiligingspakket wanneer verbinding met Oracle wordt gemaakt

  2. Zoek multidimensionale jsonb-gegevens in laravel postgres

  3. Oracle:rekenkundige bewerking resulteerde in een overloop

  4. Hoe aspnet_regsql.exe te gebruiken