2011-02-08 95 views
4

有沒有什麼辦法可以在每次更改一行時設置MySQL,然後使用最初的數據創建一行到另一個表/數據庫? (帶時間戳)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,但可以根據需要進行升級。

回答

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

使用triggers一個觸發

MySQL支持開始使用MySQL 5.0.2版本。

+1

有關多一點信息,怎麼會是如果在所有可能不錯。 – Petah 2011-02-08 04:14:28

+0

@Petah:在上面的鏈接中有幾個例子。 – 2011-02-08 06:14:41

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