【问题标题】:How to retrieve only updated/new records since the last query in SQL?自上次 SQL 查询以来,如何仅检索更新/新记录?
【发布时间】:2010-12-23 08:40:45
【问题描述】:

我被要求设计一个用于缓存 SQL 查询结果的类。调用类的查询方法会在第一时间查询并缓存整组结果;之后,每个子序列查询将只检索更新的部分,并将结果合并到缓存中。

如果要求类是通用的,即不了解数据库和表,你有什么想法吗?

是否有可能,以及如何仅检索自上次查询以来的更新/新记录?

【问题讨论】:

    标签: sql mysql tsql query-cache


    【解决方案1】:

    MySQL(据我所知,也不是任何其他基于 SQL 的数据库)不会在任何地方存储行的“最后更新时间”或“插入时间”,至少不会在您可以查询的任何地方存储(解析二进制文件) log 可能不是你想做的事情)。

    要获得“新记录”,您需要

    • 查询自动增量值高于最后一个已知最大值的所有记录
    • 将日期时间/时间戳添加到将存储记录的插入/更新时间的表中,并据此查询

    您可以考虑让您的代码创建自己的表,每次在另一个表上发生 UPDATE 或 INSERT 时存储一条记录,然后将触发器添加到将填充您的表的所有其他表。

    但这可能有点多。

    【讨论】:

    • 使用中间表变量和“NOT IN”子句怎么样?
    • 我不明白你在问什么。您将如何使用这些东西来确定新的/更新的记录?您是否建议您将表中的所有数据复制到临时表中,然后 JOIN 将原始表与您的“最后已知值”副本相对应?这将是一种非常低效的投票方式。您也可以开始散列行内容并将其存储在某个地方。
    • PostgreSQL 保留记录有效的事务 id 范围 -- 详情请参阅 postgresql.org/docs/8.1/static/ddl-system-columns.html
    • 啊,所以在 PostgreSQL 数据库中,您可以记住一行的最后一个已知事务 id,然后检查它是否已更改。漂亮!不过,我不知道这是否会对他的魔法通用课程有所帮助。
    • 逻辑是:将结果附加到当前不存在的内存表中
    【解决方案2】:

    要么你的缓存类必须得到所有更新的通知,要么你需要某种过期。

    唯一的其他选择是查询数据库进行检查,但是你有点失去了缓存的意义:)

    上述情况适用于“通用”缓存。如果您为特定表实现专门的缓存,您可能能够利用 DML 模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多