복붙노트

[SQL] 어떻게 PostgreSQL을에 정렬과 행의 고정 번호를 삭제합니까?

SQL

어떻게 PostgreSQL을에 정렬과 행의 고정 번호를 삭제합니까?

나는 포트에 PostgreSQL을에 오래된 MySQL의 쿼리를하려고 해요,하지만 난이 하나에 문제가 :

DELETE FROM logtable ORDER BY timestamp LIMIT 10;

PostgreSQL은 자사의 삭제 구문 주문 또는 제한을 허용하지 않습니다, 나는 하위 쿼리를 사용할 수 있도록 테이블에 기본 키가 없습니다. 그것은 중요하지 않습니다 있지만, 테이블 30 개 행을 포함하지만 그들은 모두 같은 타임 스탬프가있는 경우, 예를 들어, 난 여전히 10을 삭제하려면 - 또한, 나는 쿼리가 정확히 주어진 번호 또는 기록이 삭제 동작을 유지하려면 이는 10.

그래서; 어떻게 PostgreSQL을에 정렬과 행의 고정 번호를 삭제합니까?

편집 : log_id 열 또는 유사한 더가 없습니다 기본 키 의미합니다. 아, 레거시 시스템의 기쁨!

해결법

  1. ==============================

    1.당신은 CTID를 사용하여 시도해 볼 수도 있습니다 :

    당신은 CTID를 사용하여 시도해 볼 수도 있습니다 :

    DELETE FROM logtable
    WHERE ctid IN (
        SELECT ctid
        FROM logtable
        ORDER BY timestamp
        LIMIT 10
    )
    

    CTID은 다음과 같습니다

    이 또한 OID입니다하지만 당신은 테이블을 만들 때 특별히 요청하는 경우 그에만 존재한다.

  2. ==============================

    2.포스트 그레스 문서 사용 배열 대신 IN과 하위 쿼리에 좋습니다. 이 훨씬 빠르게 작동합니다

    포스트 그레스 문서 사용 배열 대신 IN과 하위 쿼리에 좋습니다. 이 훨씬 빠르게 작동합니다

    DELETE FROM logtable 
    WHERE id = any (array(SELECT id FROM logtable ORDER BY timestamp LIMIT 10));
    

    이것과 다른 트릭은 여기에서 찾을 수 있습니다

  3. ==============================

    3.

    delete from logtable where log_id in (
        select log_id from logtable order by timestamp limit 10);
    
  4. ==============================

    4.당신은 당신이 할 수있는 (순서없이) 모든 10 개 개의 레코드를 삭제할 가정 :

    당신은 당신이 할 수있는 (순서없이) 모든 10 개 개의 레코드를 삭제할 가정 :

    DELETE FROM logtable as t1 WHERE t1.ctid < (select t2.ctid from logtable as t2  where (Select count(*) from logtable t3  where t3.ctid < t2.ctid ) = 10 LIMIT 1);
    

    내 사용 사례를 들어, 10M의 레코드를 삭제이 빠른 것으로 밝혀졌다.

  5. ==============================

    5.당신은 각각의 라인에 대한 삭제를 통해 루프 절차를 쓸 수, 절차는 삭제할 항목의 수를 지정하는 매개 변수를 걸릴 수 있습니다. 그러나 그것은 MySQL의에 비해 조금 잔인한 사람입니다.

    당신은 각각의 라인에 대한 삭제를 통해 루프 절차를 쓸 수, 절차는 삭제할 항목의 수를 지정하는 매개 변수를 걸릴 수 있습니다. 그러나 그것은 MySQL의에 비해 조금 잔인한 사람입니다.

  6. ==============================

    6.기본 키가없는 경우는 복합 키 배열 어디 IN 구문을 사용할 수 있습니다.

    기본 키가없는 경우는 복합 키 배열 어디 IN 구문을 사용할 수 있습니다.

    delete from table1 where (schema,id,lac,cid) in (select schema,id,lac,cid from table1 where lac = 0 limit 1000);
    

    이것은 나를 위해 일했다.

  7. from https://stackoverflow.com/questions/5170546/how-do-i-delete-a-fixed-number-of-rows-with-sorting-in-postgresql by cc-by-sa and MIT license