如何在 SQL Update 语句中使用 LIMIT

问题描述 投票:0回答:1

我的数据库中有 100,000 条几乎相同的记录,我需要修改其中一半的一个字段。

UPDATE table_name SET schedule_start = '2023-12-19' 
WHERE schedule_start = '2023-12-18' AND email_record ->>'emailId' IN ('44617','44602','44603')
LIMIT 50000
returns a "SQL Error [42601]: ERROR: syntax error at or near "limit"
  Position: 296"

我看到的所有文档都说像我这样的简单 UPDATE 语句可以与 LIMIT 结合使用,但它不起作用。我什至在不使用 email_record 资格的情况下尝试过(这需要我进一步的工作),但我遇到了同样的问题。

所以我在谷歌上搜索了一些解决方法。首先,我尝试通过将 select 语句设置为 @id:= 的值来将语句分成 2 个,但这也是一个语法错误。它不知道 TOP 或 ROWCOUNT 是什么,并且被我尝试的嵌套子查询搞糊涂了。

sql postgresql sql-update limit dbeaver
1个回答
0
投票

您遇到的错误是由于标准 SQL 语法(包括 PostgreSQL)中的

LIMIT
语句不直接支持
UPDATE
子句。这种限制常常会导致混乱,因为
LIMIT
语句中
UPDATE
的使用在不同的数据库系统中有所不同。例如,MySQL 支持,但 PostgreSQL 不支持。

要更新 PostgreSQL 中的行子集,通常需要使用子查询来选择要更新的特定行。以下是执行此操作的一般方法:

  1. 通过

    IN
    使用子查询: 您可以在子查询中选择要更新的行的主键(或唯一标识符),然后在
    UPDATE
    语句中使用它。假设
    id
    是表中的主键或唯一列,则查询将如下所示:

    UPDATE table_name
    SET schedule_start = '2023-12-19'
    WHERE id IN (
        SELECT id
        FROM table_name
        WHERE schedule_start = '2023-12-18'
          AND email_record ->>'emailId' IN ('44617','44602','44603')
        LIMIT 50000
    );
    

    此方法更新

    id
    位于子查询选择的
    id
    集合中的行。子查询将行数限制为 50,000。

  2. 使用 CTE(通用表表达式): 另一种方法是使用 CTE 定义要更新的行。这可以更具可读性,并且对于更复杂的查询特别有用:

    WITH cte AS (
        SELECT id
        FROM table_name
        WHERE schedule_start = '2023-12-18'
          AND email_record ->>'emailId' IN ('44617','44602','44603')
        LIMIT 50000
    )
    UPDATE table_name
    SET schedule_start = '2023-12-19'
    FROM cte
    WHERE table_name.id = cte.id;
    

    在这里,CTE 选择要更新的行,然后

    UPDATE
    语句将更改应用到这些行。

请记住先在一小部分数据或备份上测试您的查询,然后再在整个数据集上运行查询,以确保其按预期工作。此外,在更新数据库中的大量行时,请注意性能影响。

© www.soinside.com 2019 - 2024. All rights reserved.