有没有办法在每次更改行时设置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,但如果需要可以升级。
答案 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