programing

조건을 사용하여 잘라내기

oldcodes 2023. 7. 28. 22:35
반응형

조건을 사용하여 잘라내기

자르기 -> 전체 테이블을 재설정합니다. 자르기를 통해 특정 레코드/체크 조건을 재설정할 수 있는 방법이 있습니까?

예를 들어, 모든 데이터를 재설정하고 마지막 30일을 테이블 내부에 유지합니다.

감사해요.

아니요.TRUNCATE전부 아니면 아무것도 아닙니다.를 할 수 .DELETE FROM <table> WHERE <conditions>하지만 이것은 속도의 이점을 잃습니다.TRUNCATE.

간단한 대답은 아니오입니다: MySQL은 다음을 추가하는 것을 허용하지 않습니다.WHERETRUNCATE진술.다음은 MySQL에 대한 문서입니다.TRUNCATE진술.

하지만 좋은 소식은 이 한계를 극복할 수 있다는 것입니다.

은 다음과 같습니다.DELETE

, 먼저, 테이충작, 간히사요세하를 하세요.DELETE진술(그것은 언급되어야 했습니다):

1. LOCK TABLE my_table WRITE;
2. DELETE FROM my_table WHERE my_date<DATE_SUB(NOW(), INTERVAL 1 MONTH);
3. UNLOCK TABLES;

LOCK그리고.UNLOCK진술은 강제적인 것은 아니지만, 그들은 상황을 가속화하고 잠재적인 교착 상태를 피할 것입니다.

불행히도 테이블이 크면 매우 느릴 것입니다.그리고 당신이 사용을 고려하고 있기 때문에.TRUNCATE진술, 당신의 테이블이 크기 때문인 것 같습니다.

따라서 다음과 같은 방법으로 문제를 해결할 수 있습니다.TRUNCATE문:

도 안전하지 않은 인 사솔단않은용루션순한을 사용합니다.TRUNCATE

1. CREATE TABLE my_table_backup AS
      SELECT * FROM my_table WHERE my_date>=DATE_SUB(NOW(), INTERVAL 1 MONTH);
2. TRUNCATE my_table;
3. LOCK TABLE my_table WRITE, my_table_backup WRITE;
4. INSERT INTO my_table SELECT * FROM my_table_backup;
5. UNLOCK TABLES;
6. DROP TABLE my_table_backup;

그러나 다른 프로세스가 동시에 테이블에 레코드를 삽입하는 경우 이 솔루션은 약간 안전하지 않습니다.

  • 1단계와 2단계 사이에 삽입된 모든 레코드가 손실됩니다.
  • 그자리의 TRUNCATE을 지정하면 " 문재합니다정설"가 재설정됩니다.AUTO-INCREMENT도 있습니다("2단계 3단계 ID" 4단계 ID입니다).AUTO-INCREMENT4).4) 다음 .

안타깝게도 테이블을 잠그고 자를 수 없습니다.하지만 우리는 (어떤 식으로든) 그 한계를 극복할 수 있습니다.RENAME.

절반은 단순하고, 빠르고, 안전하지만 소음이 많은 솔루션을 사용합니다.TRUNCATE

1. RENAME TABLE my_table TO my_table_work;
2. CREATE TABLE my_table_backup AS
     SELECT * FROM my_table_work WHERE my_date>DATE_SUB(NOW(), INTERVAL 1 MONTH);
3. TRUNCATE my_table_work;
4. LOCK TABLE my_table_work WRITE, my_table_backup WRITE;
5. INSERT INTO my_table_work SELECT * FROM my_table_backup;
6. UNLOCK TABLES;
7. RENAME TABLE my_table_work TO my_table;
8. DROP TABLE my_table_backup;

이것은 완전히 안전하고 상당히 빠를 것입니다.을 볼 수 것입니다.my_table몇 초 동안 사라집니다.이로 인해 모든 로그에 오류가 표시될 수 있습니다.따라서 안전한 해결책이지만 "시끄러움"입니다.

고지 사항:저는 MySQL 전문가가 아니기 때문에 이러한 솔루션은 실제로 형편없을 수 있습니다.제가 제공할 수 있는 유일한 보장은 그들이 저를 위해 잘 작동한다는 것입니다.만약 어떤 전문가가 이 해결책들에 대해 논평할 수 있다면, 저는 감사할 것입니다.

"모든 데이터를 재설정하고 마지막 30일을 테이블 안에 보관하고 싶습니다."라는 질문에 대한 답변입니다.

이벤트를 생성할 수 있습니다.https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html 을 확인하십시오.

예:

CREATE EVENT DeleteExpiredLog
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM log WHERE date < DATE_SUB(NOW(), INTERVAL 30 DAY);

테이블에서 일일 정리를 실행하여 최근 30일 데이터를 사용할 수 있도록 유지합니다.

데이터 펌프를 사용하여 쿼리 절을 사용하여 테이블을 내보낸 후 table_message_action=replace 절을 사용하여 테이블을 다시 가져올 수 있습니다.테이블을 삭제하고 다시 만들면 시간이 매우 적게 걸립니다.구현하기 전에 이에 대한 내용을 읽어 보십시오.

언급URL : https://stackoverflow.com/questions/3704834/truncate-with-condition

반응형