tutorial soporta segundo query por plugin optimizar lentas example cuantas consultas sql mysql database version-control triggers

soporta - optimizar consultas lentas mysql



Control de la versiĆ³n de datos MySQL (4)

Use un disparador

El soporte de MySQL para desencadenantes comenzó con MySQL versión 5.0.2.

¿Hay alguna manera de configurar MySQL cada vez que se cambia una fila, luego se crea una fila a otra tabla / base de datos con los datos originalmente? (con estampado de tiempo)

Si es así, ¿cómo podría hacerlo?

P.ej

UPDATE `live_db`.`people` SET `live_db`.`people`.`name` = ''bob'' WHERE `id` = 1;

Hace que esto suceda antes de la actualización:

INSERT INTO `changes_db`.`people` SELECT * FROM `live_db`.`people` WHERE `live_db`.`people`.`id` = 1;

Y si lo hicieras de nuevo, daría como resultado algo como esto:

`live_db`.`people` +----+-------+---------------------+ | id | name | created | +----+-------+---------------------+ | 1 | jones | 10:32:20 12/06/2010 | +----+-------+---------------------+ `changes_db`.`people` +----+-------+---------------------+ | id | name | updated | +----+-------+---------------------+ | 1 | billy | 12:11:25 13/06/2010 | | 1 | bob | 03:01:54 14/06/2010 | +----+-------+---------------------+

El DB en vivo debe tener un sello de tiempo creado en las filas, y los cambios en el DB deben tener un sello de tiempo de cuando se actualizó la fila del DB vivo. Los cambios DB tampoco tendrán claves primarias y restricciones de clave externa.

Estoy usando InnoDB y MySQL 5.1.49 pero puedo actualizar si es necesario.


Así es como terminé haciéndolo

DELIMITER | # Create the log table CREATE TABLE IF NOT EXISTS `DB_LOG`.`TABLE` LIKE `DB`.`TABLE`| # Remove any auto increment ALTER TABLE `DB_LOG`.`TABLE` CHANGE `DB_LOG`.`TABLE`.`PK` `DB_LOG`.`TABLE`.`PK` INT UNSIGNED NOT NULL| # Drop the primary keys ALTER TABLE `DB_LOG`.`TABLE` DROP PRIMARY KEY| #Create the trigger DROP TRIGGER IF EXISTS `DB`.`update_TABLE`| CREATE TRIGGER `DB`.`update_TABLE` BEFORE UPDATE ON `DB`.`TABLE` FOR EACH ROW BEGIN INSERT INTO `DB_LOG`.`TABLE` SELECT `DB`.`TABLE`.* FROM `DB`.`TABLE` WHERE `DB`.`TABLE`.`PK` = NEW.`PK`; END| DELIMITER ;


Puedes crear un disparador :

DELIMITER // CREATE TRIGGER logtrigger BEFORE UPDATE ON live_db.people FOR EACH ROW BEGIN INSERT INTO changes_db.people(id,name,updated) VALUES(OLD.id,OLD.name,now()); END; //