2014-02-19 5 views
0

관련 키가있는 두 개의 테이블이 있습니다. 관련 키가있는 tbl_one 및 tbl_two 행에서 행을 삭제하는 가장 좋은 방법을 선택하고 싶습니다. 이 작업을 올바르게 수행하려면 DELETE JOIN을 사용하여 시도했지만 매우 간단한 두 가지 명령문을 사용하여 다른 삭제 방법을 찾았습니다. 어떤 것이 더 나아 졌는지 말해 줄 수 있습니까?Mysql - 가입 삭제 대 두 삭제 문

첫 번째 방법 :

DELETE tbl_one, 
tbl_two FROM tbl_one 
JOIN tbl_two ON tbl_one.id = tbl_two.tbl_one_id WHERE tbl_one.id = 1 

두 번째 방법 :

DELETE FROM tbl_one WHERE id =1; 
DELETE FROM tbl_two WHERE tbl_one_id =1; 
+0

최상의 옵션은 계단식 삭제로 참조 무결성을 정의하는 것입니다 –

답변

0

당신이 데이터베이스 내용을 변경하기 위해 하나 또는 여러 개의 문을 사용하는 경우 트랜잭션을 사용하는 것처럼만큼 중요하지 않습니다. 거래없이이 문제가 발생할 수 있습니다

  1. 다른 프로세스가 다른 쿼리 후 문장의 일부만 처리되어 있기 때문에, "부정"입니다 데이터베이스의 상태를 하나 개의 문장을 실행하는 데이터 inbetween 접근. 이것은 하나 이상의 클라이언트가 웹 페이지 등에서 동시에 데이터베이스를 사용할 수있는 시스템에서 항상 발생할 수 있습니다.

  2. 어떤 이유로 든 후속 쿼리가 실패 할 수 있습니다. 이 경우 진술의 일부만 처리되었으며 나머지 부분은 처리되지 않았습니다. 따라서 데이터베이스는 "정의되지 않은"상태로 다시 돌아 가게됩니다.이 경우 영구적 인 상황입니다. 오류 검색을 통해 수동으로이를 방지해야하지만, 그래도 문제를 해결할 수는 없습니다.

관계형 데이터베이스 관리 시스템은 transactions을 제공합니다. 트랜잭션은 논리적 인 관점에서 여러 문을 하나의 문으로 "묶을"수있게합니다. 트랜잭션을 시작하고 명령문을 실행 한 다음 트랜잭션을 닫습니다. 예기치 않은 상황이 발생하면 트랜잭션을 항상 "롤백"할 수 있습니다. 이렇게하면 트랜잭션 시작 전처럼 안정적이고 깨끗한 데이터베이스 상황을 얻을 수 있습니다.

1

조작이 분리되어 수행되어야하는 주요 사항 (둘 다 또는 모두 없음) 트랜잭션 블록 내에 조작을 넣어야합니다. 내 관점에서는 서버가 두 개의 구문 분석 및 실행보다는 단일 쿼리로 저장 점에 도달 할 수 있기 때문에 첫 번째 쿼리가 더 잘 작동합니다.

foreign_key_check 글로벌 변수를 끄고 쿼리를 실행 한 다음 나중에 다시 켭니다.

NB : mysql에서 제공하는 계단식 외래 키 동작을 사용할 수 있습니다.