[MySQL] Wyzwalacze


(Te3ste3r) #1

Mam dwie tabele w bazie danych users  i  subscriptions. W tabeli users  jest kolumna id  (primary key, identyfikator użytkownika), a w  subscriptions  mam kolumny  id  (primary key, identyfikator subskrypcji) oraz  user_id  (identyfikator użytkownika). Chcę aby po usunięciu użytkownika z tabeli users  zostały usunięte wszystkie wszystkie rekordy w tabeli  subscriptions  których user_id  takie samo jak id  rekordu usuniętego z tabeli  users.
 

USE `mydb`;

DELIMITER $$

CREATE TRIGGER `users_ADEL` AFTER DELETE ON `users` FOR EACH ROW

BEGIN

DELETE FROM `subscriptions` WHERE `user_id`='id usuniętego rekordu z tabeli users'

END$$

DELIMITER ;
  1. Jak przekazać do zapytania id usuniętego rekordu z tabeli users z poziomu bazy mysql? Czy się nie da i muszę robić takie operacje przez php?
    1. Czy ogólnie ten wyzwalacz jest dobrze napisany?
    2. O co chodzi z tym delimiterem i dolarami po END?

(Edgarus) #2

Ogólnie to po to jest baza danych, żeby w niej trzymać dane a nie usuwać. W Twoim przypadku, lepiej dodać pola IsDeleted i oznaczać co zostało usunięte. Wyświetlać tylko te rekordy, które IsDeleted <> 1. A co do Twojego pytania, to chyba będzie tak:

DELETE FROM `subscriptions` WHERE `user_id`= OLD.<nazwa kolumny z ID>

 


(Te3ste3r) #3

Działa, bardzo dziękuję :slight_smile:
Musi być jeszcze średnik na końcu zapytania.

USE `mydb`;

DELIMITER $$

CREATE TRIGGER `users_ADEL` AFTER DELETE ON `users` FOR EACH ROW

BEGIN

DELETE FROM `subscriptions` WHERE `user_id`=OLD.id;

END$$

DELIMITER ;