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

testtabla y actualizando los datos de muestra? Por cierto, no actualiza latimestampcolumna escrita en la actualización. Si esto no se agrega en la definición de columnaON UPDATE CURRENT_TIMESTAMPRespuestas:
Dar la orden
SHOW CREATE TABLE whateverLuego 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 cualquieraINSERTsin 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,entonces necesitas emitir este tipo de actualización.
UPDATE whatevertable SET something = 'newvalue', whatevercolumn = whatevercolumn WHERE someindex = 'indexvalue'Esto funciona con columnas
TIMESTAMPyDATETIME. (Antes de la versión 5.6.5 de MySQL solo funcionaba conTIMESTAMPs) Cuando usaTIMESTAMPs, 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.fuente
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time. En mi caso tengo elDEFAULT CURRENT_TIMESTAMPpero enUPDATEla columna no está actualizado. Así que no tengo claro a qué te refieres con esta oraciónCreo 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
fuente
DEFAULT CURRENT_TIMESTAMPUna 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 = 2no 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.
fuente
INSERTsi no cambiaran los valores, por lo que una llamada PHP como$this->pdo->lastInsertId()devuelve0(para no insertar) en lugar de la identificación de la fila que contiene los datos que permanecieron igual.UPDATEnoINSERTlo es , por lo que no esperaríalastInsertIdcontener un valor, independientemente de si alguna columna cambia o no.lastInsertIdgeneralmente solo se usa cuandoINSERTuna nueva fila tiene una columna de ID de incremento automático (para averiguar qué ID se asignó); no al modificar filas existentes.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.
fuente
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
fuente