2013-03-06 1 views
0

MySQL의를 사용하여 대에서 삭제 사용의 단점은장점과 데이터를 복사 및 드롭

delete from t where not condition; 

create table s select * from t where condition; 
drop table t; 

이 매우 유사 쿼리합니다. (한 쿼리의 condition은 다른 쿼리의 condition과 동일합니다.)
두 번째 방법의 장점 중 하나는 t을 삭제하기 전에 s을 검사하여 쿼리에 아무런 문제가 없는지 확인하는 것입니다. 이것은 매우 중요한 고려 사항이며, 최소화하고 싶지는 않지만 무엇이 다른에 대한 위와 같은 질문에 대해 찬반 양론이 존재하는지 궁금합니다.

+0

둘은 동일하지 않습니다. 두 번째 테이블은't' 테이블 전체를 삭제합니다. –

+0

@MattBall, 맞습니다. 그러나't'와 같은 행을 가진's'는 (첫날에) 첫 번째 쿼리에서 끝납니다. 나는 명확한 편집을하게 해준다 .... – msh210

답변

1

두 번째 쿼리와 마찬가지로 모든 데이터베이스에서 임시 테이블을 만들 때마다 테이블 공간을 조각 모음하고 데이터베이스 성능을 저하시킵니다. 두 번째 접근법을 따르지 않을 것을 강력히 권장합니다. 당신은 정말 당신이 무엇을하는지 절대적으로 확신 할 수하려면

, 당신은 다음과 같은 코드를 사용할 수 있습니다 : 당신이 반환되는 행을 삭제할 바로 그들이다 확실하다

/* 
DELETE 
-- */ SELECT * 
FROM t 
WHERE condition; 

쉽게처럼, 첫 번째 줄의 주석의 시작을 언급 할 수 있습니다 내가 어떤 DELETE 문을 실행하기 전에

-- /* 
DELETE 
-- */ SELECT * 
FROM t 
WHERE condition; 

내가 같은 방법을 사용합니다.

+0

+1, 많은 감사. – msh210

1

첫 번째 명령은 훨씬 더 좋습니다. 따라서 SQL에 delete 명령이 있습니다. 가 삭제 명령를 재발견 할 필요가 없습니다 :

1- (,의를 만들 t 드롭) 스키마을 변경 일부 행을 삭제하고자 할 때 할 필요가 없습니다.

2t는 다른 테이블과 보존 관계를 유지할 수 있습니다. 다른 테이블의 다른 종속 행을 삭제하고 삭제시 트리거를 사용하기 위해 삭제를 계단식으로 배열 할 수도 있습니다 ...

3- 언급 한 삭제하기 전에 행을 검사하는 이점은 잘 할 수 있습니다. delete 명령을 사용하기 전에 select를 수행하십시오.

4 테이블에 다른 응용 프로그램 로직에 대한 링크가있을 수 있습니다.보고 할 ORM 클래스, SP를 말하자. 코드에 새 클래스를 만들거나 원하는 때마다 기존 SP를 업데이트 하시겠습니까? 행 몇 개를 제거 하시겠습니까?

+0

+1, 많은 감사합니다. – msh210