2011-11-05 2 views
0

글쎄, 내 친구가 내 데이터베이스에 InnoDB를 사용해야한다고 했으므로 처음으로 시도했다. 그리고 레코드/인덱스/필드/테이블을 삭제하는 데 문제가 있습니다. 레코드를 삭제하려고 할 때마다 상대 레코드를 모두 찾아서 삭제하고 원래 레코드를 삭제해야합니다. 그리고 색인을 전혀 삭제할 수 없습니다! 더 쉬운 방법이 있나요? (PHP로 실행될 때 아무것도 삭제되지 않을 것입니다.) 아니면 그냥 MyISAM으로 돌아 가야합니까? 다음 중 귀하의 의견에 어느 것이 더 낫습니까?MySQL InnoDB의 모든 관련 레코드를 삭제하는 방법은 무엇입니까?

답변

2

많은 것들을 삭제하는 것이 좋다면 InnoDB가 도움이되지 않을 수도 있습니다. InnoDB는 MyISAM보다 훨씬 더 엄격합니다. 쿼리를 수행 할 때 (SELECT, SHOW 등) 더 빠르지 만 업데이트를 수행 할 때 더 느립니다 (UPDATE, INSERT 등).

InnoDB의 CASCADE는 마술이지만 매우 신중해야합니다. 또한 매우 느립니다 (db 엔진 자체가 모두 제약 조건을 검사하기 때문입니다). 다른 삭제로 캐스케이드되는 레코드를 다른 삭제 등으로 캐스케이드하는 다른 업데이트로 캐스케이드하는 경우, 오랜 시간 기다리게 될 것입니다.

당신이 dev에에 을 삭제하고 이노의 제약에 의해 짜증하는 경우 SET FOREIGN_KEY_CHECKS = 0; 매우 도움이 될 수 :

SET FOREIGN_KEY_CHECKS = 0; 
/* do all kinds of dangerous deletes, eg. delete everything in the db */ 
SET FOREIGN_KEY_CHECKS = 1; 

응용 프로그램 자체에서 사용하거나 그 확신하지 마십시오 어떤 의존성도 깨지 않을 것입니다.

+0

예, DB 디자인은 거의 끝났지 만 앱이있는 초기 개발 단계에 있습니다. 키 검사에서는 테스트가 어렵지만 삭제하기보다는 다른 작업을 수행 할 것입니다. 외래 키가있는 일부 데이터. – ItsGreg

3

기본 테이블에서 레코드를 삭제할 때 종속 레코드를 자동으로 삭제하려면 외래 키에 ON DELETE CASCADE을 지정해야합니다. 수동으로 당

은 외래 키에 대한 제약 조건의 선택은 이들 중 하나 중 하나입니다 :

CASCADE : 삭제 또는 부모 테이블에서 행을 업데이트하고 자동으로 삭제하거나에서 일치하는 행을 갱신 자식 테이블. ON CASCADE 및 ON UPD CASCADE 모두 지원됩니다. 두 테이블 사이에 부모 테이블이나 자식 테이블의 동일한 열에서 으로 작동하는 ON ONDATE CASCADE 절을 여러 개 정의하지 마십시오.

참고 현재 계단식 외래 키 동작은 트리거를 활성화하지 않습니다.

SET NULL : 부모 테이블에서 행을 삭제하거나 업데이트하고 하위 테이블의 외래 키 열을 NULL로 설정하십시오. ON DELETE SET NULL 및 ON UPDATE SET NULL 절이 모두 지원됩니다.

SET NULL 동작을 지정하는 경우 하위 테이블의 열을 NOT NULL로 선언하지 않았는지 확인하십시오.

RESTRICT : 상위 테이블에 대한 삭제 또는 업데이트 작업을 거부합니다. RESTRICT (또는 NO ACTION) 지정은 ON DELETE 또는 ON UPDATE 절을 생략하는 것과 같습니다.

아니요 조치 : 표준 SQL의 키워드. MySQL에서는 RESTRICT와 같습니다. InnoDB는 참조 테이블에 관련 외래 키 값이있는 경우 상위 테이블에 대한 삭제 또는 업데이트 작업을 거부합니다. 일부 데이터베이스 시스템에는 지연된 검사가 있으며 NO ACTION은 지연된 검사입니다. MySQL에서는 외래 키 제약 조건이 즉시 으로 확인되므로 NO ACTION은 RESTRICT와 동일합니다.

기본값을 지정하지 않으면 NO ACTION입니다. 삭제가 현재 아무 것도하지 않는 이유가 기본값입니다.

+0

'NO ACTION'과 'RESTRICT'는 기능적으로 똑같은 것 같습니다. 나는 MySQL이 동의한다고 생각한다. 'NO ACTION'은 제약 조건이 실패 함을 의미하므로 업데이트가 불가능합니다. 'RESTRICT'도 마찬가지입니다. – Rudie

+0

@ Ruud : 물론, 'NO ACTION'설명의 맨 처음 문장은 그렇게 말합니다. – Jon

+0

불량. 못 봤어. 적어도 나는 그 길을 바로 기억하고 있었다. – Rudie

0

정확하게 작동하는 방식입니다.

이렇게하면 데이터 무결성이 유지됩니다. 사용자와 주소가 연결되어있는 경우 먼저 주소를 삭제하지 않으면 사용자를 삭제할 수 없습니다. 그렇지 않으면 사용자가 누락 된 데이터를 데이터베이스에 남겨 둡니다.

응용 프로그램을 사용하지 않을 경우 관련 데이터가 모두 삭제되었는지 확인해야합니다. 적용하려면 ON DELETE CASCADE을 사용하십시오.

일반적으로 데이터 무결성을 유지하기 위해 훨씬 더 좋습니다. myISAM으로 돌아 가지 마십시오 (각 엔진이 무엇인지에 대한 문제도 있습니다. 그러나 더 자세한 정보를주지 않으면 저것에 주거).

관련 문제