在postgresql中删除数以百万计的记录

问题描述:

我必须从拥有120百万条记录的表中删除行。 不应删除具有最高(entry_date)和次高(entry_date)的数据。在postgresql中删除数以百万计的记录

表有许多限制。 一个主键 两个FOREIGN键 和除主键上的索引之外的两个索引。

我已经成功尝试删除创建临时表并将所需数据移动到临时表中的方法。 然后删除当前表格,然后再次将过滤后的数据从temp移回主表格,并且工作正常。 但我需要一种方法来删除一堆记录。

CREATE TABLE values 
(
    value_id bigint NOT NULL, 
    content_definition_id bigint NOT NULL, 
    value_s text, 
    value_n double precision, 
    order integer, 
    scope_id integer NOT NULL, 
    answer boolean NOT NULL, 
    date timestamp without time zone NOT NULL, 
    entry_date timestamp without time zone NOT NULL, 
    CONSTRAINT "value_PK" PRIMARY KEY (value_id), 
    CONSTRAINT content_definition_id_fk FOREIGN KEY (content_definition_id) 
     REFERENCES content_definition (content_definition_id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT scope_fk FOREIGN KEY (scope_id) 
     REFERENCES scopes (scope_id) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT 
) 
-- Index: fki_content_definition_id_fk 
-- Index: fki_value_value_scope_id 

如何删除记录,如第一个只有100万的数据应该删除,并在上。

+0

我们可以禁用索引和约束,然后尝试删除。如果可以的话,请告诉我在postgres中临时禁用索引和外键的语法。 – SUDARSHAN

+0

添加表格定义和一些示例表格数据。 – jarlh

+0

已添加全表定义.. – SUDARSHAN

这假设你没有冲突的锁。请注意,索引页锁也可能会减慢速度。

最近的PostgreSQL允许您在删除语句中使用CTE。即你可以:

WITH ids_to_delete (
    SELECT value_id FROM values 
    where ... 
    limit ... 
) 
delete from values where value_id in (select value_id from ids_to_delete) 
+0

有什么办法可以暂时禁用外键约束,并且在删除启用后? – SUDARSHAN