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...

Only 1 comment left Ir a comentario

  1. Pingback: Bitacoras.com /

Leave a Reply