我通常建议你再来一次 history_x 一张一张的table x . history_x 在这种情况下,与 x ; 它的不同之处在于它是 x 的主键不是主键(即使“x”是,也不会自动递增),并且它有自己的主键,有时还会进行某种加法 changed_when 日期时间字段。 然后触发两个触发器: AFTER INSERT ON x 基本上只是克隆一个新的行 x 至 history_x AFTER UPDATE ON x 只是克隆了行的新状态 x 至 history_x 如何处理删除。通常,如果你想删除 x 记录,可以删除相应的历史记录。如果你只是在标记 x 作为“退休”,这是由更新处理涵盖。如果删除后需要保留历史记录,只需添加 x_deleted “flag”字段和一个delete触发器,该触发器克隆行的最后一个状态,但设置 x_deleted 把历史上的旗帜改为“真”。 而且,这显然不跟踪pk对 x ,但如果 history_x 有两份 x 的pk;一个是触发器与其余字段捕获的历史pk值,第二个绑定到外键,外键将级联所有旧历史以引用新键。 编辑:如果你可以利用session/@变量的半全局性,你甚至可以添加诸如谁做了更改之类的信息;但连接池通常会对此产生干扰(每个连接都是它自己的会话)。 编辑#2/警告:如果您存储的是blob或大文本字段等大数据,则可能不应在每次更新时克隆它们。 哦,是的,“更改的时间”数据也可以更有用,如果表示为 valid_from 以及 valid_until 一对字段。 valid_until 对于最新的历史记录,应该为null,并且在添加新的历史记录时,前一个最新的历史记录应该具有 valid_until 字段集。 changed_when 对于日志来说已经足够了,但是如果需要实际使用旧值 WHERE ? >= valid_from and ? < valid_until 比以前容易多了 WHERE valid_until < ? ORDER BY valid_until DESC LIMIT 1
3条答案
按热度按时间3yhwsihp1#
我通常建议你再来一次
history_x
一张一张的tablex
.history_x
在这种情况下,与x
; 它的不同之处在于它是x
的主键不是主键(即使“x”是,也不会自动递增),并且它有自己的主键,有时还会进行某种加法changed_when
日期时间字段。然后触发两个触发器:
AFTER INSERT ON x
基本上只是克隆一个新的行x
至history_x
AFTER UPDATE ON x
只是克隆了行的新状态x
至history_x
如何处理删除。通常,如果你想删除x
记录,可以删除相应的历史记录。如果你只是在标记x
作为“退休”,这是由更新处理涵盖。如果删除后需要保留历史记录,只需添加x_deleted
“flag”字段和一个delete触发器,该触发器克隆行的最后一个状态,但设置x_deleted
把历史上的旗帜改为“真”。而且,这显然不跟踪pk对
x
,但如果history_x
有两份x
的pk;一个是触发器与其余字段捕获的历史pk值,第二个绑定到外键,外键将级联所有旧历史以引用新键。编辑:如果你可以利用session/@变量的半全局性,你甚至可以添加诸如谁做了更改之类的信息;但连接池通常会对此产生干扰(每个连接都是它自己的会话)。
编辑#2/警告:如果您存储的是blob或大文本字段等大数据,则可能不应在每次更新时克隆它们。
哦,是的,“更改的时间”数据也可以更有用,如果表示为
valid_from
以及valid_until
一对字段。valid_until
对于最新的历史记录,应该为null,并且在添加新的历史记录时,前一个最新的历史记录应该具有valid_until
字段集。changed_when
对于日志来说已经足够了,但是如果需要实际使用旧值WHERE ? >= valid_from and ? < valid_until
比以前容易多了WHERE valid_until < ? ORDER BY valid_until DESC LIMIT 1
yzckvree2#
根据我的想法,你要做的是
RowNumber()
在查询中。请参阅此处了解更多详细信息。
pb3s4cty3#
我们过去所做的是改变历史表格。第一个是:改变历史
Chu id主键
表名称用于更改的表的名称
桌上的pk桌上的pk桌上的pk桌
键入insert、update、delete
变更日期变更日期
是谁做的
其次是:改变历史细节
冠心病id pk
频道id
列名
旧价值
新价值
然后我们在table上使用触发器。不能使用存储过程来捕获信息,因为DBA在进行数据更改时通常不使用存储过程。然后可以按表名和感兴趣的记录的主键进行查询。您还可以将屏幕名称添加到第一个表中,以使您能够获取对该屏幕上的记录所做的所有更改。