mysql - 특정 - 오라클 delete 쿼리




삭제 된 레코드를 가져 오기위한 SQL 쿼리 (4)

id 열이 들어있는 테이블 table1 이 있는데, 이는 int(11), not null, auto_increment 이며 1에서 시작합니다.

10,000 레코드가 있다고 가정합니다. 마지막 레코드의 ID는 10,000입니다. 3 개의 레코드를 제거하면 테이블에 9,997 개의 레코드가 있지만 마지막 레코드 ID 값은 여전히 ​​10,000입니다 (마지막 레코드가 삭제되지 않은 경우).

1 SQL 쿼리를 사용하여 제거 된 레코드를 표시하는 방법은 무엇입니까?

고맙습니다.


먼저, 10.000 개의 레코드를 생성하는 가장 쉬운 방법을 보여 드리겠습니다. 거대하고 엉뚱한 검색어는 없으며 변수도 없습니다. 실행 시간 : ~ 3ms. 링크

이제 내가 약속 한 방아쇠에 대해서. 링크

보시다시피, 정말 쉽게 만들 수 있습니다. 트리거는 다양한 조인이 필요하지 않을뿐만 아니라 날짜, 사용자 ID 등을 저장할 수도 있습니다 (매우 확장 가능한 예제). 조인에 대한 트리거의 주요 포인트는 다음과 같습니다. 얼마나 많은 레코드가 있는지 / 현재 / 없을지는 상관하지 않습니다. 크기에 대해 엄격 할 필요는 없습니다. 그래서 저는 충분히 전문적이지 않은 예의 대답을 불렀습니다. 오해해서 유감스럽게도, 우리 중 누구도 모욕하는 것을 원치 않았습니다.

이 예제를 작성함으로써 나는 몇 가지 것을 배웠습니다. 잘하면 당신도 않았다 :)



가장 쉬운 방법은 ID로 임시 / 임시 테이블을 만드는 것입니다. 1-1000 그 테이블에 조인을 남겼습니다.

그러나 일단 완료되면 더미 / 임시 테이블에서 "삭제 된"레코드를 제거하십시오. 그렇지 않으면 매번 표시됩니다.

>> EDIT << 아이디가 누락 된 경우 자기 조인을하면됩니다.

select a.id + 1 MissingIds
from <table> a
left join <table> b
  on a.id = b.id - 1
where b.id is null
  and a.id < 10000

이 답변 을 참조로 사용 했습니다 .

다음 쿼리를 사용하여 삭제 된 레코드 "범위"를 줄 간격을 찾을 수 있습니다. 예를 들어, 아래 예에서 최종 결과에서 2 행이 반환되고 값은 2와 3, 6과 7입니다. 따라서 ID가 2에서 3 인 행이 삭제되고 ID가있는 행 6에서 7의 값이 삭제되었습니다 (총 4 개의 삭제 된 행).

나는 이것이 "1 SQL 질의"에서 최종 결과를 얻으려는 요구 조건을 만족시키고 더하기 중간 또는 더미 테이블이 사용되지 않는다고 생각합니다.

delimiter $$
use test
$$

create table mytable (id int not null auto_increment, name varchar(100), primary key (id));
$$

insert into mytable (name) values('a')$$
insert into mytable (name) values('b')$$
insert into mytable (name) values('c')$$
insert into mytable (name) values('d')$$
insert into mytable (name) values('e')$$
insert into mytable (name) values('f')$$
insert into mytable (name) values('g')$$
insert into mytable (name) values('h')$$


delete from mytable where id = 2$$
delete from mytable where id = 3$$
delete from mytable where id = 6$$
delete from mytable where id = 7$$


SELECT (t1.id + 1) as gap_starts_at
     , (SELECT MIN(t3.id) -1
          FROM mytable t3 
         WHERE t3.id > t1.id) as gap_ends_at
  FROM mytable t1
 WHERE NOT EXISTS (SELECT t2.id FROM mytable t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL

산출:

gap_starts_at  gap_ends_at
2              3
6              7






gaps-and-islands