sql - 如何从不检索更改表中的不同行

标签 sql postgresql limit offset

我有一个包含数百万行的表,该表不断变化(插入、更新和删除一些新行)。我想每分钟查询 100 个新行(我以前没有查询过),但这些行不能是我以前查询过的行。该表有大约 2 打列和一个主键。

很乐意回答任何问题或提供说明。

最佳答案

一个简单的解决方案是有一个单独的表,其中只有一行来存储您获取的最后一个 ID。

假设这是您的“数百万行的表格”:

-- That's your table with million of rows
CREATE TABLE test_table (
    id serial unique,
    col1 text,
    col2 timestamp
);

-- Data sample
INSERT INTO test_table (col1, col2)
SELECT 'test', generate_series
FROM generate_series(now() - interval '1 year', now(), '1 day');

您可以创建下表来存储 ID:

-- Table to keep last id
CREATE TABLE last_query (
  last_quey_id int references test_table (id)
);
-- Initial row
INSERT INTO last_query (last_quey_id) VALUES (1);

然后使用以下查询,您将始终从原始表中获取从未获取的 100 行,并在 last_query 中维护一个指针:

WITH last_id as (
    SELECT last_quey_id FROM last_query
), new_rows as (
    SELECT *
    FROM test_table
    WHERE id > (SELECT last_quey_id FROM last_id)
    ORDER BY id
    LIMIT 100
), update_last_id as (
    UPDATE last_query SET last_quey_id = (SELECT MAX(id) FROM new_rows)
)
SELECT * FROM new_rows;

行将按照新 ID 的顺序获取(最早的行在前)。

关于sql - 如何从不检索更改表中的不同行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42796723/

相关文章:

python - 索引具有多个条件的 Python Pandas 数据框 SQL like where 语句

python - 新数据库和 Django manage.py shell 和 syncdb 没有运行

Python KeyError : <peewee. IntegerField 对象在 ... > 使用 peewee insert_many()

mysql - 如何: SQL Query - INNER JOIN with LIMIT 1 on the secondary table?

javascript - 请求 SQL 2 左外连接

mysql WHERE IN,但有多个测试值

postgresql - AWS docker multicontainer应用程序上的哪个postgres连接字符串?

c++ - 在 Ubuntu 64 位操作系统中无法读取大于 2GB 的文件

sql - 基于从另一个表中选择的值进行限制

mysql - 我需要使用 LENGTH 函数从 2 个不同的表中提取值,但仅使用 1 个查询