Si tengo una columna en una tabla de tipo TIMESTAMP
y 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
test
tabla y actualizando los datos de muestra? Por cierto, no actualiza latimestamp
columna escrita en la actualización. Si esto no se agrega en la definición de columnaON UPDATE CURRENT_TIMESTAMP
Respuestas:
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_TIMESTAMP
significa que cualquieraINSERT
sin una configuración de marca de tiempo explícita usa la hora actual. Asimismo,ON UPDATE CURRENT_TIMESTAMP
significa 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
whatevertable
sin 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
TIMESTAMP
yDATETIME
. (Antes de la versión 5.6.5 de MySQL solo funcionaba conTIMESTAMP
s) Cuando usaTIMESTAMP
s, 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_TIMESTAMP
pero enUPDATE
la 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í
Ver aqui
fuente
DEFAULT CURRENT_TIMESTAMP
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.
fuente
INSERT
si 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.UPDATE
noINSERT
lo es , por lo que no esperaríalastInsertId
contener un valor, independientemente de si alguna columna cambia o no.lastInsertId
generalmente solo se usa cuandoINSERT
una 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_TIMESTAMP
porque 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