PostgreSQL에서 정렬로 고정된 수의 행을 삭제하려면 어떻게 해야 합니까?
일부 오래된 MySQL 쿼리를 Postgre로 포팅하려고 합니다.SQL, 하지만 이 문제에 문제가 있습니다.
DELETE FROM logtable ORDER BY timestamp LIMIT 10;
PostgreSQL은 삭제 구문에서 순서 지정이나 제한을 허용하지 않으며 테이블에 기본 키가 없기 때문에 하위 쿼리를 사용할 수 없습니다.또한 쿼리가 지정된 숫자 또는 레코드를 정확히 삭제하는 동작을 유지하려고 합니다. 예를 들어 테이블에 30개의 행이 포함되어 있지만 모두 동일한 타임스탬프가 있는 경우에는 10개를 삭제합니다.
그렇다면 PostgreSQL에서 정렬을 통해 고정된 수의 행을 삭제하려면 어떻게 해야 합니까?
편집: 기본 키가 없음은 없음을 의미합니다.log_id
열 또는 이와 유사합니다.아, 레거시 시스템의 즐거움!
다음을 사용해 볼 수 있습니다.
DELETE FROM logtable
WHERE ctid IN (
SELECT ctid
FROM logtable
ORDER BY timestamp
LIMIT 10
)
그ctid
다음과 같습니다.
테이블 내 행 버전의 실제 위치입니다.참고로 비록
ctid
행 버전을 매우 빠르게 찾는 데 사용할 수 있습니다.ctid
에 의해 업데이트되거나 이동되면 변경됩니다.VACUUM FULL
.그러므로ctid
장기 행 식별자로는 사용할 수 없습니다.
또 있습니다.oid
그러나 테이블을 만들 때 특별히 요청하는 경우에만 존재합니다.
Postgres 문서에서는 IN 및 하위 쿼리 대신 어레이를 사용할 것을 권장합니다.이것은 훨씬 더 빨리 작동할 것입니다.
DELETE FROM logtable
WHERE id = any (array(SELECT id FROM logtable ORDER BY timestamp LIMIT 10));
이것과 다른 몇 가지 요령은 여기에서 찾을 수 있습니다.
delete from logtable where log_id in (
select log_id from logtable order by timestamp limit 10);
기본 키가 없는 경우 복합 키와 함께 Where IN 구문 배열을 사용할 수 있습니다.
delete from table1 where (schema,id,lac,cid) in (select schema,id,lac,cid from table1 where lac = 0 limit 1000);
이것은 저에게 효과가 있었습니다.
주문 없이 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 레코드를 삭제하는 것이 더 빠른 것으로 나타났습니다.
개별 라인에 대해 삭제를 반복하는 프로시저를 작성할 수 있으며, 이 프로시저는 삭제할 항목의 수를 지정하는 매개 변수를 사용할 수 있습니다.하지만 MySQL과 비교하면 약간 오버킬입니다.
언급URL : https://stackoverflow.com/questions/5170546/how-do-i-delete-a-fixed-number-of-rows-with-sorting-in-postgresql
'programing' 카테고리의 다른 글
확인란이 선택되어 있는지 여부를 jQuery (0) | 2023.05.16 |
---|---|
모듈 내보내기 대 Node.js 및 ES6의 내보내기 기본값 (0) | 2023.05.16 |
새 프로젝트에 대한 새 빈 분기 생성 (0) | 2023.05.16 |
Angular2의 Blur 이벤트에서 사용하는 방법은 무엇입니까? (0) | 2023.05.16 |
sqlalchemy.ex.해당 모듈 오류 없음:플러그인을 로드할 수 없습니다. sqlalchemy.dialects:postgres (0) | 2023.05.11 |