Publi

MySQL: Rellenar campos de fecha de creación y modificación con la fecha actual automáticamente

Es muy útil, al crear una tabla cuyos datos pueden ser modificados con cierta frecuencia, añadir campos que especifiquen el momento de creación y el de modificación. Por ejemplo, creamos la siguiente tabla de configuración para una aplicación:

1
2
3
4
5
6
7
8
9
10
CREATE SCHEMA PoesiaBinaria;

CREATE TABLE PoesiaBinaria.configuracion (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `pref` VARCHAR (64) NOT NULL,
    `value` VARCHAR(128) NOT NULL,
    `ctime` DATETIME NOT NULL,
    `mtime` DATETIME NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE =MyISAM;

El objetivo es que cuando creemos un nuevo valor, éste rellene automáticamente las fechas de creación y modificación a la fecha actual. Podríamos crear un procedimiento almacenado por el cuál crear nuevos valores, y asegurarnos de utilizar siempre el procedimiento en lugar de un INSERT, o podremos crear un trigger que se dispare cuando creemos un nuevo elemento en la tabla:

1
2
3
4
5
6
7
DELIMITER $$
CREATE TRIGGER `PoesiaBinaria`.`createSetting` BEFORE INSERT ON `PoesiaBinaria`.`configuracion`
    FOR EACH ROW BEGIN
        SET NEW.ctime = NOW();
        SET NEW.mtime = NOW();
    END $$
DELIMITER ;

Con esto, siempre que ejecutemos lo siguiente:

1
INSERT INTO PoesiaBinaria.configuracion (`pref`, `value`) VALUES ('test', 'testValue');

Se habrán rellenado también los dos campos de fecha.

Ahora necesitamos también crear otro trigger para que cuando el valor se actualice, también lo haga la fecha de modificación:

1
2
3
4
5
6
DELIMITER $$
CREATE TRIGGER PoesiaBinaria.updateSetting BEFORE UPDATE ON `PoesiaBinaria`.configuracion
    FOR EACH ROW BEGIN
        SET NEW.mtime = NOW();
    END $$
DELIMITER ;

Así, cuando hagamos un UPDATE, la fecha de modificación se actualizará automáticamente, y por ejemplo, podremos liberar la carga de programarlo en el lenguaje con el que interactuamos con MySQL.

Extra

Por curiosidad, dejo aquí la solución de la que hablé al principio, con procedimientos almacenados:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DELIMITER $$
CREATE PROCEDURE `PoesiaBinaria`.`insertConfiguracion` (
    `In_pref` VARCHAR (64),
    `In_value` VARCHAR(128)
) BEGIN
    INSERT INTO `PoesiaBinaria`.`configuracion` (`pref`, `value`, `ctime`, `mtime`)
        VALUES (In_pref, In_value, NOW(), NOW());
END $$
DELIMITER ;

DELIMITER $$
CREATE PROCEDURE `PoesiaBinaria`.`updateConfiguracion` (
    `In_pref` VARCHAR (64),
    `In_value` VARCHAR(128)
) BEGIN
    UPDATE `PoesiaBinaria`.`configuracion` SET `value`=In_value, `mtime`=NOW() WHERE `pref`=In_pref;
END $$
DELIMITER ;

Así, siempre que vayamos a insertar un nuevo parámetro de configuración debemos hacer:

1
CALL PoesiaBinaria.insertConfiguracion('filas_por_pagina', 50);

y cuando queramos modificar un dato:

1
CALL PoesiaBinaria.updateConfiguracion('filas_por_pagina', 20);

Observaremos que las fechas de los campos de creación y actualización se modificarán automáticamente igual que lo hacíamos con los triggers.

También podría interesarte....

There are 3 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. tunnel rush /
    Usando Google Chrome Google Chrome 113.0.0.0 en Windows Windows NT

    Gracias por compartir el código y la explicación detallada de cómo utilizar triggers y procedimientos almacenados en MySQL para mantener actualizadas las fechas de creación y modificación en una tabla de configuración. La utilización de estos mecanismos es una práctica común y muy útil para mantener la integridad de los datos y automatizar tareas repetitivas.

  3. Victor Patrick /
    Usando Google Chrome Google Chrome 113.0.0.0 en Windows Windows NT

    Has presentado una solución sólida y bien estructurada para mantener las fechas de creación y modificación actualizadas automáticamente en una tabla de configuración en MySQL. Esto simplifica el manejo de los datos y evita posibles errores al tener que actualizar manualmente las fechas en cada operación. tunnel rush

Leave a Reply