与上一章节所提到的历史表不同,历史表需要经常翻查所以我们需要用到索引。审计表通常是数据归档,不允许修改,且基本上很少访问。
CREATE TABLE `order` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID', `name` varchar(45) NOT NULL COMMENT '订单名称', `price` float NOT NULL COMMENT '价格', `ctime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表'
基于 order 表创建 order_audit 审计表
create table order_audit engine=archive as select * from `order`;
order_audit 表结构如下
CREATE TABLE `order_audit` ( `id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '订单ID', `name` varchar(45) NOT NULL COMMENT '订单名称', `price` float NOT NULL COMMENT '价格', `ctime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ) ENGINE=ARCHIVE DEFAULT CHARSET=utf8
创建插入和更新触发器,用于插入和修改的时候同事写入一份到归档表中。
DROP TRIGGER IF EXISTS `test`.`order_AFTER_INSERT`; DELIMITER $$ USE `test`$$ CREATE DEFINER=`dba`@`%` TRIGGER `test`.`order_AFTER_INSERT` AFTER INSERT ON `order` FOR EACH ROW BEGIN INSERT INTO order_audit SELECT * FROM `order` WHERE id = NEW.id; END$$ DELIMITER ; DROP TRIGGER IF EXISTS `test`.`order_AFTER_UPDATE`; DELIMITER $$ USE `test`$$ CREATE DEFINER=`dba`@`%` TRIGGER `test`.`order_AFTER_UPDATE` AFTER UPDATE ON `order` FOR EACH ROW BEGIN INSERT INTO order_audit SELECT * FROM `order` WHERE id = NEW.id; END$$ DELIMITER ;
原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。