sql >> Database teknologi >  >> Database Tools >> phpMyAdmin

Kan ikke oprette en TRIGGER fra en anden lagret rutine -- Hvad er en anden lagret rutine?

Triggeren du viser ovenfor er fin.

rediger: Når du opretter en trigger i phpMyAdmins GUI, behøver du kun at indtaste udløserens krop i Definition rude, med andre ord delen BEGIN...END .

Dette er fordi phpMyAdmin vil prøve at være klog og skrive trigger-headeren for dig baseret på de andre elementer, du indtaster (navn, tabel, tidspunkt, begivenhed).

Her er den rigtige måde at definere en trigger i phpMyAdmin:

Hvis du skriver CREATE TRIGGER... header inde i kroppen, vil den forvirre MySQL, fordi den vil se CREATE TRIGGER... CREATE TRIGGER... BEGIN...END . Dette får MySQL til at tro, at du definerer en trigger, hvis første sætning er CREATE TRIGGER .

Som et sideproblem fra dit oprindelige spørgsmål vil jeg foreslå nogle ændringer i udløserens krop:

CREATE TRIGGER Update_Last_Transit_Status AFTER INSERT ON Delivery 
FOR EACH ROW
BEGIN
  UPDATE Transportation
    INNER JOIN Transit ON Transit.Transportation_ID = Transportation.ID
    INNER JOIN Route ON Transit.ID = Route.Transit_ID
  SET Transportation.Status = 'Dispatched'
  WHERE Route.Delivery_ID = NEW.ID
    AND Transportation.Status = 'In Branch';
END

Ændringerne:

  • Reference NEW.ID i stedet for Delivery.ID .
  • Brug SQL-92 JOIN syntaks i stedet for SQL-89 "kommastil" joins.
  • Brug multi-table UPDATE med joins i stedet for EXISTS med korreleret underforespørgsel.
  • Brug enkelte anførselstegn til strenge i stedet for dobbelte anførselstegn.
  • Afslut UPDATE sætning med semikolon.



  1. Hvordan indstilles BEGIN_TRANSACTION automatisk i SSMS (SQL Server Management Studio)?

  2. Phpmyadmin eksporter VIEW uden DATABASE_NAME eller ALGORITHM

  3. MySQL Workbench går ned ved start på Windows

  4. Hvorfor ville phpmyadmin være væsentligt hurtigere end mysql-kommandolinjen?