Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trigger before delete
Forum PHP.pl > Forum > Bazy danych > MySQL
nono91
Cześć , przed usunięciem rekordu chcę aby trigger wstawił w jedną tabelę pewien rekord, a z innej usunął. Jak zrobię jedną z tych czynności to działa, lecz jak chcę dwie na raz pojawia się problem , ponieważ nie mogę utworzyć dwóch triggerów before delete. A gdy próbuję w jednym triggerze wykonać obie operacje , to niestety wyskakuje błąd o błędniej składni.
  1. CREATE TRIGGER `delete`
  2. BEFORE DELETE ON `articles`
  3. FOR EACH ROW
  4. BEGIN
  5. DELETE FROM articlesHistory WHERE OLD.id = id ;
  6.  
  7. INSERT INTO articlesremoved
  8. SELECT a.*, NOW()
  9. FROM articles a
  10. WHERE id = OLD.id;
  11.  
  12. END
  13.  
  14.  
  15.  
kartin
Jeśli masz kod dokładnie taki jak powyżej, to średnik oznacza koniec zapytania, a trigger jednak w tym miejscu się nie kończy. Musisz ustawić sobie inny znak końca zapytania np.:
  1. DELIMITER //
  2.  
  3. CREATE TRIGGER `delete` AFTER DELETE ON articles
  4. FOR EACH ROW
  5. BEGIN
  6. DELETE FROM articlesHistory WHERE id = OLD.id;
  7.  
  8. INSERT INTO articlesremoved
  9. VALUES (OLD.kolumna1, OLD.kolumna2, OLD.kolumna3, NOW())
  10. END //
  11.  
  12. DELIMITER ;

Poza tym w DELETE powinno być WHERE id = OLD.id a wyzwalacz raczej powinien być wykonywany dopiero po modyfikacji danych - AFTER DELETE. Jeśli będzie wykonywany przed to może się zdarzyć, że kasowanie nie powiedzie się to trigger i tak zostanie wywołany. Wydaje się, że to jest tutaj niepożądane.
nono91
Dzięki za odpowiedź. Zapisało bez błędów , ale albo coś źle jest skonstruowane albo tak nie da się zrobić. A mianowicie mam 2 tabele articles i articleshistory. W articlesHistory mam klucz obcy z articles.
Relacja jest 1 - wielu (articles-articlesHistory)
Dlatego też przez usunięciem rekordu z articles chcę uruchomić wyzwalacz by najpierw usunął wszystkie rekordy z tabeli articlesHistory o kluczu obcym taki jaki jest usuwany z tabeli articles. Ale niestety wyskakuje błąd pokazujący constraint o kluczu obcym. Co robię źle ?
Oczywiście zmieniłem w kodzie wyżej na BEFORE DELETE z powodu jaki przed chwilą podałem.
Pyton_000
To po kiego wałka używasz do tego Triggerów? Przecież to się załatwia Kluczami obcymi właśnie i ON DELETE CASCADE
nono91
.... rzeczywiście , robiłem tak wcześniej i nie działało ale była tego inna przyczyna i potem próbowałem to zrobić triggerem. Dzięki wielkie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.