Kiedy jest aktualizowany znacznik czasu (automatycznie)?

79

Jeśli mam kolumnę w tabeli typu TIMESTAMPi 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

Jim
źródło
2
dlaczego nie próbowałeś tego, tworząc testtabelę i aktualizując przykładowe dane. Nawiasem mówiąc, nie aktualizuje timestampwpisanej kolumny w update. Jeśli nie zostanie to dodane w definicji kolumnyON UPDATE CURRENT_TIMESTAMP
OldGaurd01

Odpowiedzi:

138

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_TIMESTAMPoznacza, że ​​każdy INSERTbez wyraźnego ustawienia znacznika czasu używa aktualnego czasu. Podobnie ON UPDATE CURRENT_TIMESTAMPoznacza, ż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ć whatevertablebez zmiany sygnatury czasowej, to znaczy

Aby zapobiec aktualizacji kolumny w przypadku zmiany innych kolumn

wtedy musisz wydać tego rodzaju aktualizację.

UPDATE whatevertable
   SET something = 'newvalue',
       whatevercolumn = whatevercolumn
 WHERE someindex = 'indexvalue'

Działa z kolumnami TIMESTAMPi DATETIME. (Przed wersją MySQL 5.6.5 działał tylko z TIMESTAMPs). Kiedy używasz TIMESTAMPs, 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.

O. Jones
źródło
1
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time. W moim przypadku mam DEFAULT CURRENT_TIMESTAMP ale na UPDATEkolumnie nie jest aktualizowana. Więc nie jestem pewien, co masz na myśli w tym zdaniu
Jim
Zobacz moją edycję, w której próbowałem wyjaśnić. Domyślne zachowanie INSERT i UPDATE jest kontrolowane oddzielnie.
O. Jones,
Tak, obie operacje INSERT i UPDATE, które podają nazwę kolumny timestamp, zastąpią domyślne zachowanie current_timestamp.
O. Jones
1
Dziękuję Panu. Idealne rozwiązanie jednego z moich problemów
Edwinfad
phpMyAdmin mówi, że wystąpił błąd w zapytaniu SQL "Masz błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, aby znaleźć właściwą składnię w pobliżu" NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP "w linii 1"
Primož Kralj
14

Myślę, że musisz zdefiniować kolumnę znacznika czasu w ten sposób

UTWÓRZ TABELĘ t1 
(
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Zobacz tutaj

juergen d
źródło
1
Mój ma tylkoDEFAULT CURRENT_TIMESTAMP
Jim
4

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.

Aleksandra
źródło
Potwierdzone zachowanie zgodnie z opisem w MySQL. Co więcej, nie liczy się jako, INSERTjeśli żadna wartość nie uległa zmianie, więc wywołanie PHP $this->pdo->lastInsertId()zwraca 0(bez wstawiania) zamiast identyfikatora wiersza zawierającego dane, które pozostały takie same.
OXiGEN
@OXiGEN - UPDATEnie jest INSERT, więc nie spodziewałbym lastInsertIdsię, że będzie zawierał wartość - niezależnie od tego, czy jakakolwiek kolumna się zmieni, czy nie. lastInsertIdjest 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
ToolmakerSteve
3

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.

Sibin John Mattappallil
źródło
2

Dodawanie miejsca, w którym można znaleźć, UPDATE CURRENT_TIMESTAMPponieważ 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

BrinkDaDrink
źródło