Влияет ли MySQL foreign_key_checks на всю базу данных?


201

Когда я выполняю эту команду в MySQL:

SET FOREIGN_KEY_CHECKS=0;

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


15
test: войти в mysql: показать переменные типа '% FOREIGN%'; SET FOREIGN_KEY_CHECKS = 0; После этого войдите в MySQL, используя другую консоль. Я вижу, что переменные показа как "% FOREIGN%" включены вместо ВЫКЛ.
Шон Нгуен

Ответы:


246

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

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;

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 -система-variables.html


1
Дорого ли стоит установка foreign_key_checks для каждого запроса? У меня есть скрипт для обновления БД, и я бы не хотел, чтобы кто-нибудь еще мог переопределить проверки внешнего ключа по умолчанию во время этого обновления. Так что я бы сделал миллионы запросов, и мне стало интересно, будет ли SET значимым или нет?
Аки

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

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

12

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

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
Допустим, у вас есть таблица со ссылками на идентификаторы, но некоторые ссылочные записи отсутствуют. Если вы добавите внешний ключ (FK), когда FOREIGN_KEY_CHECKS включены, 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 на новый локальный сервер Apache (я использую XAMPP на компьютере с Windows). На самом деле я не знаю, что означает эта ошибка, но, выполнив шаги, описанные ниже, я импортировал базу данных без ошибок. Надеюсь, что это может помочь:

Изменение php.ini в C: \ xampp \ php \ php.ini

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

Изменение my.ini в C: \ xampp \ mysql \ bin \ my.ini

max_allowed_packet = 1024M

-2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.