MySQL foreign_key_checks가 전체 데이터베이스에 영향을 줍니까?


201

MySQL 에서이 명령을 실행할 때 :

SET FOREIGN_KEY_CHECKS=0;

전체 엔진에 영향을 미치나요? 아니면 현재 거래에만 해당됩니까?


15
테스트 : mysql에 로그인 : '% FOREIGN %'와 같은 변수 표시; SET FOREIGN_KEY_CHECKS = 0; 그 후 다른 콘솔을 사용하여 mysql에 로그인하십시오. '% FOREIGN %'와 같은 표시 변수가 OFF 대신 ON임을 알 수 있습니다.
Sean Nguyen

답변:



98

실제로 foreign_key_checks전역 변수와 로컬 (세션 당) 변수라는 두 가지 변수 가 있습니다 . 연결되면 세션 변수는 전역 변수의 값으로 초기화됩니다.
이 명령 SET foreign_key_checks은 세션 변수를 수정합니다.
전역 변수를 수정하려면 SET GLOBAL foreign_key_checks또는을 사용하십시오 SET @@global.foreign_key_checks.

다음 매뉴얼 섹션을
참조 하십시오 . http://dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server -system-variables.html


1
각 요청에서 foreign_key_checks를 설정하는 데 많은 비용이 듭니까? DB를 업그레이드하는 스크립트가 있는데 다른 사람이 기본적으로 외래 키 검사를 재정의하는 것을 원하지 않습니다. 그래서 수백만 건의 쿼리를 작성하고 SET이 중요하지 않을지 궁금했습니다.
Aki

@Aki DB를 업그레이드하는 경우 다른 모든 사람의 액세스를 잠그는 것이 좋습니다. 최소한 글쓰기에는 적합합니다. 그렇지 않으면 모든 종류의 동시 액세스 문제가 발생할 수 있습니다.
tishma

1
큰 대답과 구별. 작동 방식의 결과를 인식하는 것이 중요합니다. 이는 GLOBAL을 설정할 수 없으며 foreign_key_checks동일한 세션에서 외래 키 제약 조건을 무시할 것으로 예상 한다는 것을 의미합니다 . 비전 역 변수를 설정해야합니다.
Tyler Collier

12

Ron이 설명했듯이 local과 global이라는 두 가지 변수가 있습니다. 지역 변수는 항상 사용되며 연결시 전역 변수와 동일합니다.

SET FOREIGN_KEY_CHECKS=0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

SHOW Variables WHERE Variable_name='foreign_key_checks'; # always shows local variable

GLOBAL 변수를 설정하면 기존 연결에 대해 로컬 변수가 변경되지 않습니다. 로컬 변수도 다시 연결하거나 설정해야합니다.

직관적이지 않은 MYSQL은 FOREIGN_KEY_CHECKS를 다시 활성화 할 때 외래 키를 적용하지 않습니다. 따라서 외래 키와 검사가 켜져 있어도 일관성이없는 데이터베이스를 만들 수 있습니다.

외래 키가 완전히 일관되게하려면 확인이 켜져있는 동안 키를 추가해야합니다.


1
"... 외래 키를 완전히 일관성있게 유지하려면 검사가 켜져있는 동안 키를 추가해야합니다."
user2782001

4
참조 ID가있는 테이블이 있지만 일부 참조 레코드가 누락되었다고 가정 해 봅시다. FOREIGN_KEY_CHECKS가 ON 인 동안 외래 키 (FK)를 추가하면 Mysql은 오류가 발생하고 참조가 손상되어 FK 추가를 거부합니다. FOREIGN_KEY_CHECKS가 꺼져있는 동안 외래 키를 추가하면 mysql은 오류없이 계속됩니다. 나중에 확인을 활성화하더라도 오류는 없습니다. FK가 있어도 데이터가 일치하지 않는 테이블이 생겼습니다. 따라서 FK 검사가 켜져있는 동안 추가되지 않는 한 FK의 존재는 데이터베이스 일관성을 보장하지 않습니다.
Bouke Versteegh

10
# will get you the current local (session based) state.
SHOW Variables WHERE Variable_name='foreign_key_checks';

GLOBAL을 설정하지 않은 경우 세션 만 영향을받습니다.


1

Drupal 데이터베이스를 새로운 로컬 아파치 서버로 마이그레이션하려고 할 때 동일한 오류가 발생했습니다 (Windows 시스템에서 XAMPP를 사용하고 있습니다). 실제로이 오류의 의미를 모르지만 아래 단계를 시도한 후 오류없이 데이터베이스를 가져 왔습니다. 이것이 도움이되기를 바랍니다.

C : \ xampp \ php \ php.ini에서 php.ini 변경

max_execution_time = 600
max_input_time = 600
memory_limit = 1024M
post_max_size = 1024M

C : \ xampp \ mysql \ bin \ my.ini에서 my.ini 변경

max_allowed_packet = 1024M

-2

Mysql 쿼리 브라우저를 사용하는 경우 SET FOREIGN_KEY_CHECKS=0;버전 1.1.20에 영향을 미치지 않습니다. 그러나 Mysql 쿼리 브라우저 1.2.17에서는 제대로 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.