【问题标题】:How to delete first few records from a table without any criteria in PostgreSQL?如何在 PostgreSQL 中没有任何条件的情况下从表中删除前几条记录?
【发布时间】:2015-05-22 09:16:45
【问题描述】:

我想无条件地从我的表中删除前 500 条记录。

表定义如下:

CREATE TABLE txn_log
(
  txn_log_timestamp timestamp without time zone NOT NULL,
  txn_log_pgm_id character(6)
)
WITH (OIDS=FALSE);

我这里没有任何主键。我试图删除使用

DELETE FROM txn_log LIMIT 500

但它抛出错误:

错误:在“LIMIT”第 1 行或附近出现语法错误:从 TXN_LOG 删除 限制 5000 ^

**********错误**********

错误:在“LIMIT”处或附近出现语法错误

有人可以建议我这样做吗?

【问题讨论】:

标签: sql postgresql


【解决方案1】:

尝试使用LIMIT 准备子查询,如下所示

DELETE FROM txn_log
WHERE txn_log_pgm_id IN (SELECT txn_log_pgm_id
                         FROM txn_log
                         ORDER BY txn_log_timestamp asc
                         LIMIT 500)

【讨论】:

  • 不幸的是,在我在生产中应用此命令后,我丢失了所有记录 :(。你为什么这样做?
  • 你不应该在没有测试的情况下在生产中做这样的事情
【解决方案2】:
DELETE
FROM txn_log
WHERE ctid IN (
        SELECT ctid
        FROM txn_log
        ORDER BY txn_log_timestamp limit 500
        )

根据Documentation

ctid
行版本在其表中的物理位置。笔记 虽然 ctid 可以用来定位行版本非常 很快,一行的 ctid 将在每次更新或移动时发生变化 真空已满。因此 ctid 作为长期行标识符是无用的。 应该使用 OID,甚至更好的是用户定义的序列号 识别逻辑行。

【讨论】:

    【解决方案3】:

    无条件怎么做:

    DELETE FROM txn_log
    WHERE (txn_log_pgm_id,txn_log_timestamp)  IN 
      (
      SELECT txn_log_pgm_id,txn_log_timestamp
      FROM txn_log
      LIMIT 500
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多