[mysql] trigger modyfikujący zawartość w trzeciej tabeli

0

-1
down vote
favorite

Mam problem, jak zrobić trigger który zmodyfikuje dane w tabeli powiązanej przez tabelę pośrednią, mam takie tabele:

  • person
    -- ID
    -- NAME
    -- TIMESTAMP
  • travel
    -- ID
    -- NAME
  • person_travel
    -- ID
    -- ID_PERSON
    -- ID_TRAVEL
    Trigger powinien zmodyfikować pole TIMESTAMP w tabeli person.
    Jeżeli w jakimś wierszu tabeli travel zostanie dokonana zmiana, powinien zostać zmieniony TIMESTAMP w tabeli person, ale tylko w tych rekordach które są powiązane z tabelą travel przez wpis w tabeli person_travel.
1

Pokaż, jak się starałeś.

0

no i? Zacznij od napisania polecenia SQL (UPDATE), które zmodyfikuje żądany rekord bazując na id z tabeli travel

0

zapytanie sql które modyfikuje pole o które mi chodzi:
UPDATE person JOIN person_travel ON person.ID = person_travel.ID_PERSON JOIN travel ON travel.ID = person_travel.ID_TRAVEL SET person.TIMESTAMP = NOW() WHERE travel.ID = (travel.ID aktualizowanego rekordu)
i co dalej?

0
  1. jesteś pewna, że potrzebujesz włączać w to zapytanie tabelę travel?
  2. no to jak masz całość to gdzie masz problem? https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html
0

Jestem pewien, chodzi mi o zmianę timestamp w 'person' w zależności od modyfikacji 'travel' który jest powiązany z 'person' przez 'person_travel'
mam trigger:
BEGIN
UPDATE person JOIN person_travel ON person.ID = person_travel.ID_PERSON JOIN travel ON travel.ID = person_travel.ID_TRAVEL SET person.TIMESTAMP_C = NOW();
END
ale modyfikuje mi wszystkie rekordy w 'person', co zmienić żeby było dobrze?

0
  1. gdzie masz w trigerze WHERE travel.ID = (travel.ID aktualizowanego rekordu)? BTW jak dostać się do (travel.ID aktualizowanego rekordu) masz w linku, który wklepiłem wcześniej
  2. skoro w warunku masz ograniczenie na travel.ID a jednocześnie travel.ID jest równy person_travel.ID_TRAVEL to czy nie jest logicznym filtrować nie po travel.ID ale po person_travel.ID_TRAVEL i pozbyć się jednego, niepotrzebnego złączenia?
0

odp 1 zrobiłem i działa:
tabela travel:
BEGIN
UPDATE person JOIN person_travel ON person.ID = person_travel.ID_PERSON JOIN travel ON travel.ID = person_travel.ID_TRAVEL SET person.TIMESTAMP_C = NOW() WHERE travel.ID = NEW.ID;
END

odp 2:
niestety nie mogę tak zrobić, ponieważ tabela 'person_travel' nie zawsze jest zmieniana wtedy co tabela 'travel' więc muszę zrobić osobne triggery dla obydwu.
Zrobiłem:
person_travel:
BEGIN
UPDATE person JOIN person_travel ON person.ID = person_travel.ID_PERSON SET person.TIMESTAMP_C = NOW() WHERE person_travel.ID = NEW.ID;
END

Wszystko chodzi dziękuję za pomoc, temat może być do zamknięcia, chyba że ktoś ma coś do dodania, chętnie przeczytam.

1
  1. triggera zakładasz na tabeli travel ale w UPDATE łączenie z tabelą travel jest zbędne

UPDATE person JOIN person_travel ON person.ID = person_travel.ID_PERSON SET person.TIMESTAMP_C = NOW() WHERE person_travel.ID_TRAVEL = NEW.ID;

0

muszę uściślić pierwszy trigger dla tabeli travel:
CREATE TRIGGER travel_au AFTER UPDATE ON travel
FOR EACH ROW BEGIN
UPDATE person JOIN person_travel ON person.ID = person_travel.ID_PERSON JOIN travel ON travel.ID = person_travel.ID_TRAVEL SET person.TIMESTAMP_C = NOW() WHERE travel.ID = NEW.ID;
END

drugi trigger dla tabeli person_travel (tu nie ma zmian, jest dopisanie nowego rekordu lub skasowanie):
CREATE TRIGGER person_travel_ai AFTER INSERT ON person_travel
FOR EACH ROW BEGIN
UPDATE person JOIN person_travel ON person.ID = person_travel.ID_PERSON SET person.TIMESTAMP_C = NOW() WHERE person_travel.ID = NEW.ID;
END

dlatego twój pomysł się nie nada, bo dalej nie będzie uwzględniał zmian (update) w travel.

0

Masz całkowitą rację, po prostu mój mózg nie chciał przyjąć, że komputer jest mądry, a to ja byłem głupi, dzięki za poprawienie i wbicie do głowy, ten sposób DZIAŁA.
UPDATE person JOIN person_travel ON person.ID = person_travel.ID_PERSON SET person.TIMESTAMP_C = NOW() WHERE person_travel.ID_TRAVEL = NEW.ID;

1 użytkowników online, w tym zalogowanych: 0, gości: 1