0

거대한 mysql sql 덤프 파일이 있습니다. 하지만 외래 키 검사로 인해 가져 오기를 시도 할 때 오류가 발생합니다. 어떻게 든 누락 된 데이터가 있으므로외국 테이블 검사가 실패한 MySQL 테이블 정리

과 함께 가져오고 있습니다. 누락 된 데이터에 대한 해결책을 찾고 있습니다.

누락 된 항목이있는 관계 데이터를 찾아 삭제하여 데이터베이스 덤프를 새로 만들거나 모든 관계에 대해 manuel SQL을 작성하고 누락 된 값을 삭제하는 쿼리를 작성해야하는 자동 방법이 있습니까?

+0

당신은 당신이'FOREIGN_KEY_CHECKS =에 대해 잊지 않을 것입니다 청소 완료되면 0 '나는 희망 : P – Drew

+0

그것은 SESSION 변수입니다 – tanaydin

답변

1

는이 같은 삭제 문을 자동화 할 수 있습니다 :

DELIMITER $$ 
DROP PROCEDURE IF EXISTS check_foreign $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `check_foreign`() 
BEGIN 
DECLARE finishing INTEGER DEFAULT 0; 
DECLARE vstmt VARCHAR(4000); 
DECLARE vtbname VARCHAR(50); 
DECLARE vtbnameref VARCHAR(50); 
DECLARE vtbcol VARCHAR(50); 
DECLARE vtbcolref VARCHAR(50); 

DECLARE cr_tables CURSOR FOR select a.table_name, a.referenced_table_name, a.column_name, a.referenced_column_name from information_schema.KEY_COLUMN_USAGE a where a.table_schema = 'protocol_manager' and a.REFERENCED_TABLE_NAME is not null order by a.table_name; 
DECLARE CONTINUE HANDLER FOR not found SET finishing = 1; 

OPEN cr_tables; 

SET vstmt = ''; 

table_foreign_delete: loop 

if finishing = 1 then 
    leave table_foreign_delete; 
end if; 

FETCH cr_tables INTO vtbname, vtbnameref, vtbcol, vtbcolref; 

SET vstmt = CONCAT(vstmt, char(10), 'DELETE FROM ', vtbname, ' a WHERE NOT EXISTS (SELECT 1 FROM ', vtbnameref, ' b WHERE a.', vtbcol, ' = b.', vtbcolref, ');'); 

end loop table_foreign_delete; 

select vstmt; 

END$$ 
DELIMITER ; 

당신은이 동적으로 그것을 실행할 수있는 방법을 찾기 위해 깊은 검색을 할 수 있습니다. 예 : 트리거가있는 임시 테이블. delete 문을 생성하고 임시 테이블에 삽입 한 다음 다른 문 (func, proc)을 실행하여 삽입 된 문을 실행합니다.

+0

그럼 나는이 기능을 수동 :) 감사하여 청소해야, 이해). – tanaydin