2011-12-16 2 views
151

Когда я выполнить эту команду в MySQL:Использует ли MySQL foreign_key_checks всю базу данных?

SET FOREIGN_KEY_CHECKS=0; 

ли это влияет на весь двигатель или это только моя текущая транзакция?

+13

тест: войти в mysql: показать переменные типа «% FOREIGN%»; SET FOREIGN_KEY_CHECKS = 0; После этого войдите в mysql, используя другую консоль. Я вижу, что переменные show, такие как% FOREIGN%, включены, а не OFF. –

ответ

169

Это зависит от сеанса, когда вы настроены так, как вы делали в своем вопросе.

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

В соответствии с этим, FOREIGN_KEY_CHECKS является "И" за рамки. Это означает, что он может быть установлен на сессии:

SET FOREIGN_KEY_CHECKS=0;

или глобально:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

92

На самом деле, есть два foreign_key_checks переменные: глобальная переменная и локальная переменная (за сеанс). После подключения переменная сеанса инициализируется значением глобальной переменной.
Команда SET foreign_key_checks изменяет переменную сеанса.
Чтобы изменить глобальную переменную, используйте SET GLOBAL foreign_key_checks или SET @@global.foreign_key_checks.

Consult следующие ручные разделы:
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 по каждому запросу дорого? У меня есть сценарий для обновления БД, и я бы не хотел, чтобы кто-либо еще мог переопределить проверки внешнего ключа по умолчанию во время этого обновления. Поэтому я бы сделал миллионы запросов, и я подумал, будет ли SET значительным или нет? – Aki

+0

@Aki Если вы обновляете БД, я бы сказал, что вам лучше заблокировать доступ для всех остальных. По крайней мере, для написания. В противном случае вы можете ожидать всевозможные проблемы одновременного доступа. – tishma

+0

Отличный ответ и различие. Важно понять, как это работает. Это означает, что вы не можете установить GLOBAL 'foreign_key_checks' и в этом же сеансе ожидать, что он будет игнорировать ограничения внешних ключей. Вам нужно установить неглобальную переменную. –

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

Если вы не SET GLOBAL, только ваша сессия была затронута.

-1

В случае использования браузера запросов Mysql, SET FOREIGN_KEY_CHECKS=0; не имеет никакого отношения к версии 1.1.20. Тем не менее, он отлично работает в браузере запросов Mysql 1.2.17

9

Как поясняет Рон, существуют две переменные: локальная и глобальная. Локальная переменная всегда используется и совпадает с глобальным при соединении.

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

+3

Допустим, у вас есть таблица со ссылочными идентификаторами, но некоторые ссылочные записи отсутствуют. Если вы добавите внешний ключ (FK), когда FOREIGN_KEY_CHECKS включены, Mysql поднимет ошибку и откажется добавить FK из-за неработающей ссылки. При добавлении внешнего ключа, когда FOREIGN_KEY_CHECKS выключены, mysql продолжает работать без ошибок. Даже если вы включите проверки после этого, ошибок не будет. Теперь у вас есть таблица с непоследовательными данными, хотя есть FK. Таким образом, наличие FK не является гарантией согласованности базы данных, если только оно не было добавлено во время проверки FK. –

Смежные вопросы