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;
//
Lamento comentar una publicación anterior, pero estaba buscando resolver este problema exacto. Pensé que compartiría esta información.
Esto describe una solución perfectamente:
http://www.hirmet.com/mysql-versioning-records-of-tables-using-triggers