Jeśli mam kolumnę w tabeli typu TIMESTAMP
i ma ona domyślnie: CURRENT_TIMESTAMP czy ta kolumna zostanie zaktualizowana do bieżącego znacznika czasu, jeśli zaktualizuję wartość dowolnej innej kolumny w tym samym wierszu?
Wydaje się, że tak nie jest, ale nie jestem pewien, czy tak się stanie.
Nie mogę zrozumieć, co to oznacza ( z dokumentacji MySQL ):
Jeśli kolumna jest aktualizowana automatycznie, jest automatycznie aktualizowana do bieżącego znacznika czasu, gdy wartość dowolnej innej kolumny w wierszu zostanie zmieniona z bieżącej wartości. Kolumna pozostaje niezmieniona, jeśli wszystkie inne kolumny są ustawione na ich bieżące wartości. Aby zapobiec aktualizowaniu kolumny po zmianie innych kolumn, jawnie ustaw jej bieżącą wartość. Aby zaktualizować kolumnę, nawet jeśli inne kolumny się nie zmieniają, jawnie ustaw jej wartość, którą powinna mieć] 2
test
tabelę i aktualizując przykładowe dane. Nawiasem mówiąc, nie aktualizujetimestamp
wpisanej kolumny w update. Jeśli nie zostanie to dodane w definicji kolumnyON UPDATE CURRENT_TIMESTAMP
Odpowiedzi:
Wydaj polecenie
SHOW CREATE TABLE whatever
Następnie spójrz na definicję tabeli .
Prawdopodobnie ma taką linię
logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
w tym.
DEFAULT CURRENT_TIMESTAMP
oznacza, że każdyINSERT
bez wyraźnego ustawienia znacznika czasu używa aktualnego czasu. PodobnieON UPDATE CURRENT_TIMESTAMP
oznacza, że każda aktualizacja bez jawnej sygnatury czasowej powoduje aktualizację do bieżącej wartości znacznika czasu.Możesz kontrolować to domyślne zachowanie podczas tworzenia tabeli.
Lub, jeśli kolumna sygnatury czasowej nie została utworzona poprawnie, możesz ją zmienić.
ALTER TABLE whatevertable CHANGE whatevercolumn whatevercolumn TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Spowoduje to, że zarówno operacje INSERT, jak i UPDATE na tabeli automatycznie zaktualizują kolumnę sygnatury czasowej. Jeśli chcesz zaktualizować
whatevertable
bez zmiany sygnatury czasowej, to znaczywtedy musisz wydać tego rodzaju aktualizację.
UPDATE whatevertable SET something = 'newvalue', whatevercolumn = whatevercolumn WHERE someindex = 'indexvalue'
Działa z kolumnami
TIMESTAMP
iDATETIME
. (Przed wersją MySQL 5.6.5 działał tylko zTIMESTAMP
s). Kiedy używaszTIMESTAMP
s, strefy czasowe są uwzględniane: na poprawnie skonfigurowanym serwerze te wartości są zawsze przechowywane w UTC i tłumaczone na czas lokalny po pobraniu.źródło
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time
. W moim przypadku mamDEFAULT CURRENT_TIMESTAMP
ale naUPDATE
kolumnie nie jest aktualizowana. Więc nie jestem pewien, co masz na myśli w tym zdaniuMyślę, że musisz zdefiniować kolumnę znacznika czasu w ten sposób
Zobacz tutaj
źródło
DEFAULT CURRENT_TIMESTAMP
Automatycznie aktualizowana kolumna jest automatycznie aktualizowana zgodnie z bieżącą sygnaturą czasową, gdy wartość dowolnej innej kolumny w wierszu zostanie zmieniona z bieżącej wartości. Kolumna aktualizowana automatycznie pozostaje niezmieniona, jeśli wszystkie inne kolumny mają ustawione aktualne wartości.
Aby to wyjaśnić, wyobraźmy sobie, że masz tylko jeden wiersz:
------------------------------- | price | updated_at | ------------------------------- | 2 | 2018-02-26 16:16:17 | -------------------------------
Teraz, jeśli uruchomisz następującą kolumnę aktualizacji:
update my_table set price = 2
nie zmieni wartości updated_at, ponieważ wartość ceny w rzeczywistości nie uległa zmianie (była już 2).
Ale jeśli masz inny wiersz z wartością ceny inną niż 2, wartość updated_at tego wiersza (z ceną <> 3) zostanie zaktualizowana do CURRENT_TIMESTAMP.
źródło
INSERT
jeśli żadna wartość nie uległa zmianie, więc wywołanie PHP$this->pdo->lastInsertId()
zwraca0
(bez wstawiania) zamiast identyfikatora wiersza zawierającego dane, które pozostały takie same.UPDATE
nie jestINSERT
, więc nie spodziewałbymlastInsertId
się, że będzie zawierał wartość - niezależnie od tego, czy jakakolwiek kolumna się zmieni, czy nie.lastInsertId
jest zwykle używany tylko przy nowy wiersz mającą kolumnę identyfikator automatyczny przyrost (stwierdzanie, jaki został przydzielony identyfikator); nie przy zmianie istniejących rzędów.INSERT
Dodaj wyzwalacz w bazie danych:
DELIMITER // CREATE TRIGGER update_user_password BEFORE UPDATE ON users FOR EACH ROW BEGIN IF OLD.password <> NEW.password THEN SET NEW.password_changed_on = NOW(); END IF; END // DELIMITER ;
Czas zmiany hasła zostanie zaktualizowany tylko po zmianie kolumny hasła.
źródło
Dodawanie miejsca, w którym można znaleźć,
UPDATE CURRENT_TIMESTAMP
ponieważ dla nowych ludzi jest to zamieszanie.Większość ludzi będzie używać phpmyadmin lub czegoś podobnego.
Wybrana wartość domyślna to CURRENT_TIMESTAMP
Atrybuty (inne menu) wybierasz UPDATE CURRENT_TIMESTAMP
źródło