2013-02-15 3 views
1

내 데이터베이스에 5 개의 MyISAM 테이블이 있다고 가정 해 봅니다. 각 테이블에는 키가 있습니다. "id_num"이라고합니다 ...MyISAM에서 삭제하기 전에 테이블간에 행이 있는지 확인해야합니까?

"id_num"은 모든 테이블을 함께 연결하는 데 사용하는 필드입니다. 특정 값의 "id_num"이 모든 테이블에 나타나거나 때로는 테이블의 서브 세트에만 나타날 수 있습니다.

데이터베이스의 특정 "id_num"인스턴스를 모두 삭제하려면 모든 테이블에서 DELETE 명령을 수행하거나 "id_num"값이 존재하는지 확인해야합니까?

DELETE * FROM table1 WHERE id_num = 123; 
DELETE * FROM table2 WHERE id_num = 123; 
DELETE * FROM table3 WHERE id_num = 123; 
DELETE * FROM table4 WHERE id_num = 123; 
DELETE * FROM table5 WHERE id_num = 123; 

아니면 삭제하기 전에 테이블에 이러한 행이 있는지 확인하기 위해 각 테이블에서 SELECT 명령을 수행해야합니까? 모범 사례는 무엇입니까? 다른에 FK를 한 테이블을 id_num와 PK로하고 id_num을 -

(. 내가 여기있는 옵션이 있으므로 삭제 계단식의 MyISAM을하지 않습니다 사용하고 있습니다) 다음과 같이 설계를 변경해야처럼

+0

forgein 키를 사용하고 삭제할 때 캐스케이드 처리 – sandeepKumar

답변

0

SELECT를 처음 실행하는 것에 대한 질문에 대답하려면 이렇게하는 것이 좋습니다. 주어진 테이블에 행이 없으면 DELETE는 단순히 0 행에 영향을줍니다. 일치하는 행이 있으면 먼저 SELECT를 수행 한 다음 DELETE를 수행하면 행을 찾는 작업이 두 배로 늘어납니다. 그래서 DELETE를 수행하고 끝내십시오.

MySQL에 다중 테이블 DELETE 구문이 있다는 것을 알고 계십니까?

당신이 표가 일치하는 행을 가지고 있음을 확신하는 경우, 외부 사용은 다른 사람을 위해 조인 : 특별히 다른,

DELETE table1.*, table2.*, table3.*, table4.*, table5.* 
FROM table1 
LEFT OUTER JOIN table2 USING (id_num) 
LEFT OUTER JOIN table3 USING (id_num) 
LEFT OUTER JOIN table4 USING (id_num) 
LEFT OUTER JOIN table5 USING (id_num) 
WHERE table1.idnum = 123; 

내가 있으리라 믿고있어 ID_NUM이 모든 테이블에 색인이 저조한 수행합니다 가입하기 . 그러나 행을 찾기 위해 인덱스를 사용하지 않고 DELETE를 수행하면 성능이 떨어집니다.

+0

다중 테이블 DELETE 구문을 지적 해 주셔서 감사합니다. 당신은 내 다음 질문을 예상하고 대답했습니다. – iakkam

1

는 소리 테이블, on-delete-cascade. 이렇게하면 하나의 delete 문을 실행하여 모든 적용 가능한 데이터를 삭제할 수 있습니다 (일반적으로 더 정확한 작업 방법이기도 함).

위의 내용은 MyISAM에서는 작동하지 않지만, a workaround using triggers이 있습니다 (하지만 지금은 덜 매력적인 옵션처럼 보입니다).

하지만 위의 쿼리가 작동해야한다고 생각합니다. 먼저 무엇인가 존재하는지 확인해야 할 필요가 없습니다. DELETE은 아무 것도하지 않습니다.

대부분의 API는 데이터가 실제로 삭제되었는지 여부를 확인하려는 경우 일종의 rows affected을 제공합니다.

+0

MyISAM 엔진과 외래 키/삭제 캐스케이드를 사용할 수 있다고 생각하지 않습니다 ... 제가 틀 렸습니다? – iakkam

+0

@paxmercatoria 내 잘못, 편집하십시오. – Dukeling

0

테이블에서 삭제하기 전에 select 쿼리를 실행하면 안됩니다. select 쿼리는 서버에 약간의 추가로드를줍니다. 그러나 삭제 쿼리를 실행 한 후에는 PHP에서 mysql_affected_rows() 함수를 사용하여 삭제 된 행 수를 확인할 수 있습니다.

관련 문제