MySQL数据版本控制

时间:2011-02-08 03:52:34

标签: sql mysql database version-control triggers

有没有办法在每次更改行时设置MySQL,然后使用最初的数据创建一行到另一个表/数据库? (带时间戳)

如果是这样,我该怎么做呢?

E.g。

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

在更新之前发生这种情况:

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

如果你再次这样做会导致类似这样的事情:

`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 |
+----+-------+---------------------+

实时数据库需要在行上创建一个时间戳,并且更改数据库需要具有更新实时数据库行的时间戳。 更改DB也没有主键和外键约束。

我正在使用InnoDB和MySQL 5.1.49,但如果需要可以升级。

4 个答案:

答案 0 :(得分:4)

使用触发器

MySQL对triggers的支持始于MySQL 5.0.2版。

答案 1 :(得分:2)

您可以创建trigger

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;
\\

答案 2 :(得分:1)

这就是我最终做到的方式

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 ;

答案 3 :(得分:0)

很抱歉对旧帖发表评论,但我希望解决这个问题!我以为我会分享这些信息。

这完美地概括了一个解决方案:

http://www.hirmet.com/mysql-versioning-records-of-tables-using-triggers