我现在已经阅读了几个主题并做了一些关于将更改记录到mysql表的研究.首先让我解释一下我的情况:
我有一张带桌子的票务系统:'票'
截至目前,我已经创建了触发器,它将在我的表中输入一个重复的条目:'ticket_history',其中"action" "user"和"timestamp"作为附加列.经过几周的测试和测试后,我对这个版本感到不满,因为每次更改都会在历史记录表中创建我的行的完整副本.我确实知道磁盘空间很便宜,我不应该担心它,但是为了找回用户的某种日志或漂亮的历史是痛苦的,至少对我来说是这样.还有我写过的触发器,即使没有变化,我也会在历史记录中获得新的一行.但这只是我触发器的设计缺陷!
这是我的触发器:
BEFORE UPDATE ON ticket FOR EACH ROW
BEGIN
INSERT INTO ticket_history
SET
idticket = NEW.idticket,
time_arrival = NEW.time_arrival,
idticket_status = NEW.idticket_status,
tmp_user = NEW.tmp_user,
action = 'update',
timestamp = NOW();
END
Run Code Online (Sandbox Code Playgroud)
在花了一些时间讨论这个话题之后,我想出了一个我想讨论和实现的方法.但首先我会对此有一些疑问:
我的想法是创建一个新表:
id sql_fwd sql_bwd keys values user timestamp
-------------------------------------------------------------------------
1 UPDATE... UPDATE... status 5 14 12345678
2 UPDATE... UPDATE... status 4 7 12345678
Run Code Online (Sandbox Code Playgroud)
在我看来,流程看起来像这样:
首先,我会从数据库中选择一些或更多内容:
SELECT keys FROM ticket; …
我想要的是:
到目前为止我所拥有的:
让我们说一个包含以下内容的地方表:
(约16000行)
CREATE TABLE `locations` (
`locationID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL,
`firstname` varchar(100) DEFAULT NULL,
`lastname` varchar(100) DEFAULT NULL,
`street` varchar(100) NOT NULL,
`city` varchar(100) NOT NULL,
`state` varchar(100) NOT NULL,
`zipcode` varchar(10) NOT NULL,
`phone` varchar(20) NOT NULL,
`web` varchar(255) DEFAULT NULL,
`machine` enum('Unbekannt','Foo','Bar') DEFAULT 'Unbekannt',
`surface` enum('Unbekannt','Foo','Bar','') DEFAULT 'Unbekannt',
PRIMARY KEY (`locationID`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)
现在我有了世界上所有城镇的第二张桌子:
(约340万行)
CREATE TABLE …Run Code Online (Sandbox Code Playgroud)