以下是示例,例如,我有一个名为Profile
的表,并且具有不同的列,如:
id, firstName, secondName, address
通常,我在信息中创建一个完整的配置文件,数据库将变为这样:
1| Ted | WONG | Hong Kong |
之后,我可以像这样更新数据
1| Ted | WONG | US |
数据Hong Kong
将被UPDATE
SQL命令更改,我将丢失以前的数据。那么,有没有办法让数据库跟踪以前的数据并维护当前的信息?感谢。
答案 0 :(得分:2)
添加随每次更新而增加的版本号列,但保留相同的ID。然后,当检索给定id的最新行时,您需要执行
where versionNo = (select max(versionNo) from table where id = <outerTableAliasOrVariable>.id)
答案 1 :(得分:1)
这可以通过存储所有历史数据并具有group
列来实现:
id, firstname,secondname, address, group
然后当你更新数据时,你永远不会ALTER
它,你只需添加一个新版本。
因此,您的表格如下所示:
1, Ted, Wong, Hong Kong, 1
2, Ted, Wong, US, 1
因此,要检索当前(或最后)修订,您需要选择适当的修订版本:
SELECT TOP 1 * FROM <table> WHERE Group = 1 ORDER BY id DESC
答案 2 :(得分:1)
添加“版本”列作为要跟踪版本的每个表的第一列及其子表。该列应作为第一列添加到您的群集主键中。当前版本应始终具有Version = 0,以便更轻松地编写查询,而不需要在每个查询中搜索MAX(版本)。确保所有子表都包含Version列并在其外键中引用它。在更新之前,将所有相关表中的Version = 0数据复制到Version = 1。下一次更新将复制到Version = 2,依此类推。最终,您将获得Version = 1中最旧的数据,Version = 0中的最新数据和Version = X中的最新数据。这样,您可以通过将数据从Version = X复制到Version = 0来制作复杂的数据库模式,控制数据版本并能够将数据完全回滚到历史版本。
在您的情况下,您的新表结构将是......
版本,ID,firstName,secondName,地址(PK- VersionId,id)
如果你有一个子表,就像一个事务表,它看起来像这样......
版本,ID,TransactionId,金额(PK- VersionId,id,TransactionId)
我已经使用这种方法来维护数据版本,而无需额外的表来支持它。