2010-05-08 5 views
2

테이블에서 여러 행을 삭제하려고하는데 데이터베이스 관계 때문에 그 행 중 하나를 삭제할 수없는 경우 어떻게됩니까?mysql 삭제 및 데이터베이스 관계

관계에 의해 제한되지 않는 행은 계속 삭제됩니까? 아니면 전체 삭제가 실패합니까?

+2

이 테이블을 2 개의 더미 테이블로 아주 빨리 테스트 할 수 있습니다 ... –

답변

1

단일 삭제 명령문 인 경우 전체 삭제가 실패합니다.

2

MySQL에서 외래 키 제약 조건을 설정하면 존재하지 않는 ID를 삽입하거나 기존 ID를 삭제하려고하면 쿼리가 실패합니다.

즉, 삭제가 실패합니다.

0

모든 행이 삭제됩니다. 그러나 프로그램이 관련 행을 삭제하는지 확인해야합니다. 그렇지 않으면 게시물/레코드/누락 된 항목이 누락됩니다.

0

이 여기보다 일반적인 질문 :

  • 내가 여러 행에 영향을 미치는 SQL 문을 수행하는 경우는, 그것이 일부 행을 수정 한 후 오류가 발생, 무슨 일이 발생합니다.

대답은 본질적으로 "이미 영향을받은 사람이 아니며 이미 성공한 사람도 있습니다"입니다.

내부적으로 일어나는 일은 다소 복잡합니다. InnoDB는 트랜잭션 세이브 포인트를 지원하며 데이터베이스는 현재 트랜잭션 내에서 명령문 시작 부분에 암시 적 세이브 포인트를 작성합니다. 명령문이 부분적으로 실패하면 암시 적 세이브 포인트로 롤백이 다시 발생합니다. 이것은 성명서가없는 것처럼 보인다는 것을 의미합니다 (READ_UNCOMMITTED 격리 수준을 사용하는 사람들을 제외하고는 상관하지 않습니다).

명시 적 트랜잭션을 사용하는지 여부에 관계없이 이러한 상황이 발생합니다. 명시 적 트랜잭션을 사용하는 경우 현재 트랜잭션은 롤백되지 않습니다 (데드락 및 잠금 대기 제한 시간과 같은 특정 유형의 오류 제외). 대신 교착 상태가 끊어 지도록 허용해야합니다. 진술의 시작.