외래 키 제약 조건이 있는 InnoDB 테이블을 조작할 때는 수정 후 데이터 무결성을 확인하는 것이 필수적입니다. 그러나 단순히 외래 키 검사를 다시 활성화하는 것만으로는 위반을 감지하는 데 충분하지 않을 수 있습니다.
테이블 로딩 중 데이터 불일치를 방지하려면 삽입하기 전에 외래 키 검사를 일시적으로 비활성화할 수 있습니다. 새 행을 만들고 프로세스가 완료된 후 다시 활성화하세요.
SET FOREIGN_KEY_CHECKS=0; -- Insert new rows SET FOREIGN_KEY_CHECKS=1;
그러나 외래 키 검사를 다시 활성화한 후에도 InnoDB의 제약 조건 검사 지연 특성으로 인해 여전히 발견되지 않은 위반이 있을 수 있습니다. 이러한 문제를 사전에 감지하고 수정하려면 다음 저장 프로시저를 사용할 수 있습니다.
DELIMITER $$ CREATE PROCEDURE `ANALYZE_INVALID_FOREIGN_KEYS`( checked_database_name VARCHAR(64), checked_table_name VARCHAR(64), temporary_result_table ENUM('Y', 'N')) LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE DONE INT DEFAULT 0; -- Iterate over foreign keys DECLARE foreign_key_cursor CURSOR FOR SELECT `TABLE_SCHEMA`, `TABLE_NAME`, `COLUMN_NAME`, `CONSTRAINT_NAME`, `REFERENCED_TABLE_SCHEMA`, `REFERENCED_TABLE_NAME`, `REFERENCED_COLUMN_NAME` FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE `CONSTRAINT_SCHEMA` LIKE checked_database_name AND `TABLE_NAME` LIKE checked_table_name AND `REFERENCED_TABLE_SCHEMA` IS NOT NULL; DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1; -- Create temporary result table for invalid foreign keys IF temporary_result_table = 'Y' THEN DROP TEMPORARY TABLE IF EXISTS INVALID_FOREIGN_KEYS; CREATE TEMPORARY TABLE INVALID_FOREIGN_KEYS(...); ELSE DROP TABLE IF EXISTS INVALID_FOREIGN_KEYS; CREATE TABLE INVALID_FOREIGN_KEYS(...); END IF; -- Check foreign key violations and insert into result table OPEN foreign_key_cursor; foreign_key_cursor_loop: LOOP FETCH foreign_key_cursor INTO TABLE_SCHEMA_VAR, TABLE_NAME_VAR, COLUMN_NAME_VAR, CONSTRAINT_NAME_VAR, REFERENCED_TABLE_SCHEMA_VAR, REFERENCED_TABLE_NAME_VAR, REFERENCED_COLUMN_NAME_VAR; IF DONE THEN LEAVE foreign_key_cursor_loop; END IF; SET @from_part = "..."; SET @full_query = "..."; PREPARE stmt FROM @full_query; EXECUTE stmt; IF @invalid_key_count > 0 THEN INSERT INTO INVALID_FOREIGN_KEYS SET `TABLE_SCHEMA` = TABLE_SCHEMA_VAR, `TABLE_NAME` = TABLE_NAME_VAR, `COLUMN_NAME` = COLUMN_NAME_VAR, `CONSTRAINT_NAME` = CONSTRAINT_NAME_VAR, `REFERENCED_TABLE_SCHEMA` = REFERENCED_TABLE_SCHEMA_VAR, `REFERENCED_TABLE_NAME` = REFERENCED_TABLE_NAME_VAR, `REFERENCED_COLUMN_NAME` = REFERENCED_COLUMN_NAME_VAR, `INVALID_KEY_COUNT` = @invalid_key_count, `INVALID_KEY_SQL` = "..."; END IF; DEALLOCATE PREPARE stmt; END LOOP foreign_key_cursor_loop; END$$ DELIMITER ;
저장 프로시저를 사용하려면 원하는 데이터베이스 및 테이블 이름으로 실행하세요.
CALL ANALYZE_INVALID_FOREIGN_KEYS('%', '%', 'Y'); DROP PROCEDURE IF EXISTS ANALYZE_INVALID_FOREIGN_KEYS; SELECT * FROM INVALID_FOREIGN_KEYS;
INVALID_FOREIGN_KEYS 테이블에는 참조 및 참조 테이블, 열, 특정 위반 행을 식별하는 데 사용할 수 있는 SQL 쿼리.
위 내용은 InnoDB 테이블에서 외래 키 위반을 감지하고 수정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!