¿Cuándo se actualiza una marca de tiempo (automática)?

79

Si tengo una columna en una tabla de tipo TIMESTAMPy tiene por defecto: CURRENT_TIMESTAMP, ¿esta columna se actualiza a la marca de tiempo actual si actualizo el valor de cualquier otra columna en la misma fila?
Parece que no, pero no estoy seguro de si esto es lo que debería suceder.
No puedo entender lo que esto significa ( de la documentación de MySQL ):

Si la columna se actualiza automáticamente, se actualiza automáticamente a la marca de tiempo actual cuando el valor de cualquier otra columna de la fila cambia de su valor actual. La columna permanece sin cambios si todas las demás columnas se establecen en sus valores actuales. Para evitar que la columna se actualice cuando cambian otras columnas, establézcala explícitamente en su valor actual. Para actualizar la columna incluso cuando otras columnas no cambian, establézcala explícitamente en el valor que debería tener] 2

Jim
fuente
2
¿Por qué no lo ha intentado creando una testtabla y actualizando los datos de muestra? Por cierto, no actualiza la timestampcolumna escrita en la actualización. Si esto no se agrega en la definición de columnaON UPDATE CURRENT_TIMESTAMP
OldGaurd01

Respuestas:

138

Dar la orden SHOW CREATE TABLE whatever

Luego mire la definición de la tabla .

Probablemente tenga una línea como esta

logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

en eso. DEFAULT CURRENT_TIMESTAMPsignifica que cualquiera INSERTsin una configuración de marca de tiempo explícita usa la hora actual. Asimismo, ON UPDATE CURRENT_TIMESTAMPsignifica que cualquier actualización sin una marca de tiempo explícita da como resultado una actualización del valor de la marca de tiempo actual.

Puede controlar este comportamiento predeterminado al crear su tabla.

O, si la columna de marca de tiempo no se creó correctamente en primer lugar, puede cambiarla.

ALTER TABLE whatevertable
     CHANGE whatevercolumn 
            whatevercolumn TIMESTAMP NOT NULL
                           DEFAULT CURRENT_TIMESTAMP 
                           ON UPDATE CURRENT_TIMESTAMP;

Esto hará que las operaciones INSERT y UPDATE en la tabla actualicen automáticamente su columna de marca de tiempo. Si desea actualizar whatevertablesin cambiar la marca de tiempo, es decir,

Para evitar que la columna se actualice cuando cambian otras columnas

entonces necesitas emitir este tipo de actualización.

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

Esto funciona con columnas TIMESTAMPy DATETIME. (Antes de la versión 5.6.5 de MySQL solo funcionaba con TIMESTAMPs) Cuando usa TIMESTAMPs, las zonas horarias se contabilizan: en una máquina servidor configurada correctamente, esos valores siempre se almacenan en UTC y se traducen a la hora local al recuperarlos.

O. Jones
fuente
1
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time. En mi caso tengo el DEFAULT CURRENT_TIMESTAMP pero en UPDATEla columna no está actualizado. Así que no tengo claro a qué te refieres con esta oración
Jim
Vea mi edición donde traté de aclarar. El comportamiento predeterminado de INSERTAR y ACTUALIZAR se controla por separado.
O. Jones
Sí, las operaciones INSERT y UPDATE que dan el nombre de la columna de marca de tiempo anularán el comportamiento predeterminado current_timestamp.
O. Jones
1
Gracias Señor. Solución perfecta para uno de mis problemas
Edwinfad
phpMyAdmin dice que hay un error con la consulta SQL "Tiene un error en la sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de 'NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' en la línea 1"
Primož Kralj
14

Creo que tienes que definir la columna de marca de tiempo así

CREAR TABLA t1 
(
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Ver aqui

juergen d
fuente
1
El mío solo tiene elDEFAULT CURRENT_TIMESTAMP
Jim
4

Una columna de actualización automática se actualiza automáticamente a la marca de tiempo actual cuando el valor de cualquier otra columna de la fila cambia de su valor actual. Una columna que se actualiza automáticamente permanece sin cambios si todas las demás columnas se establecen en sus valores actuales.

Para explicarlo, imaginemos que solo tiene una fila:

-------------------------------
| price | updated_at          |
-------------------------------
|  2    | 2018-02-26 16:16:17 |
-------------------------------

Ahora, si ejecuta la siguiente columna de actualización:

 update my_table
 set price = 2

no cambiará el valor de updated_at, ya que el valor del precio en realidad no cambió (ya era 2).

Pero si tiene otra fila con un valor de precio distinto de 2, entonces el valor updated_at de esa fila (con el precio <> 3) se actualizará a CURRENT_TIMESTAMP.

Alejandro
fuente
Comportamiento confirmado como se describe en MySQL. Además, no cuenta como INSERTsi no cambiaran los valores, por lo que una llamada PHP como $this->pdo->lastInsertId()devuelve 0(para no insertar) en lugar de la identificación de la fila que contiene los datos que permanecieron igual.
OXiGEN
@OXiGEN: UPDATEno INSERTlo es , por lo que no esperaría lastInsertIdcontener un valor, independientemente de si alguna columna cambia o no. lastInsertIdgeneralmente solo se usa cuando INSERTuna nueva fila tiene una columna de ID de incremento automático (para averiguar qué ID se asignó); no al modificar filas existentes.
ToolmakerSteve
3

Agregue un disparador en la base de datos:

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 ;

La hora de cambio de contraseña se actualizará solo cuando se cambie la columna de contraseña.

Sibin John Mattappallil
fuente
2

Agregando dónde encontrar UPDATE CURRENT_TIMESTAMPporque para las personas nuevas esto es una confusión.

La mayoría de la gente usará phpmyadmin o algo parecido.

Valor predeterminado que selecciona CURRENT_TIMESTAMP

Atributos (un menú desplegable diferente) que seleccione UPDATE CURRENT_TIMESTAMP

BrinkDaDrink
fuente