chcę śledzić historię zmian dla użytkownika, aby za każdym razem, gdy zmienia on swój profil, muszę brać stare dane i przechowywać je w historii oraz aktualizować o nowe dane.
Mogę użyć a, select
aby uzyskać stare dane, insert
przejść do historii i wreszcie update
zmienić dane.
czy mogę mieć to wszystko w jednym zapytaniu w mysql bez użycia procedur przechowywanych, wyzwalaczy itp., takich jak używanie blokad itp., jeśli tak, to daj mi małą próbkę.
Odpowiedzi:
Aby to zrobić bez ryzyka zablokowania innego użytkownika próbuje zaktualizować sam profil w tym samym czasie, trzeba zablokować wiersz w
t1
pierwszym, a następnie użyć transakcji (jak Rolando podkreśla w komentarzach do Twojego pytania):źródło
Nie wierzę, że istnieje sposób na połączenie wszystkich trzech stwierdzeń. Najbliższa rzecz tak naprawdę nie pomaga, a jest to WYBÓR ZESTAWU. Twój najlepszy zakład to wyzwalacz. Poniżej znajduje się przykład wyzwalacza, którego często używam do utrzymania właśnie takiej ścieżki audytu (zbudowanej z PHP):
źródło
Przekonałem się, że to zapytanie działa na serwerach SQL i MySQL
INSERT INTO t2 SELECT * FROM t1 WHERE id=10; UPDATE t1 SET id=11 WHERE id=10;
Mam nadzieję, że przyda się to innym także w przyszłości.
źródło