如何在PostgreSQL中从没有任何条件的表中删除前几条记录?

jei2mxaa  于 2022-09-21  发布在  PostgreSQL
关注(0)|答案(3)|浏览(317)

我想无条件地从我的表中删除前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 LIMIT 5000^中删除

  • 错误*

错误:位于或接近“Limit”的语法错误

有人能建议我做这件事的方法吗?

f4t66c6m

f4t66c6m1#

尝试使用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)
3zwjbxry

3zwjbxry2#

DELETE
FROM txn_log
WHERE ctid IN (
        SELECT ctid
        FROM txn_log
        ORDER BY txn_log_timestamp limit 500
        )

根据Documentation

ctid

行版本在其表中的物理位置。请注意,尽管ctid可用于非常快速地定位行版本,但每次Vacuum Full更新或移动行的ctid时,行的ctid都会更改。因此,CTID作为长期行标识符是无用的。应该使用OID或用户定义的序列号来标识逻辑行。

fafcakar

fafcakar3#

下面是如何无条件地做到这一点:

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
  )

相关问题