test: войти в mysql: показать переменные типа '% FOREIGN%'; SET FOREIGN_KEY_CHECKS = 0; После этого войдите в MySQL, используя другую консоль. Я вижу, что переменные показа как "% FOREIGN%" включены вместо ВЫКЛ.
Шон Нгуен
Ответы:
246
Это основано на сеансе, когда установлено так, как вы сделали в своем вопросе.
На самом деле, есть две foreign_key_checksпеременные: глобальная переменная и локальная (для каждой сессии) переменная. При подключении переменная сеанса инициализируется значением глобальной переменной.
Команда SET foreign_key_checksизменяет переменную сеанса.
Чтобы изменить глобальную переменную, используйте SET GLOBAL foreign_key_checksили SET @@global.foreign_key_checks.
Дорого ли стоит установка 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. Это позволяет создать несовместимую базу данных, даже если включены внешние ключи и проверки.
Если вы хотите, чтобы ваши внешние ключи были полностью согласованы, вам нужно добавить ключи, когда включена проверка.
Можете ли вы уточнить ... «Если вы хотите, чтобы ваши внешние ключи были полностью согласованными, вам нужно добавить ключи, когда включена проверка».
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, это затронуло только вашу сессию.
У меня была та же ошибка, когда я пытался перенести базу данных Drupal на новый локальный сервер Apache (я использую XAMPP на компьютере с Windows). На самом деле я не знаю, что означает эта ошибка, но, выполнив шаги, описанные ниже, я импортировал базу данных без ошибок. Надеюсь, что это может помочь:
В случае использования браузера запросов Mysql, SET FOREIGN_KEY_CHECKS=0;не оказывает влияния в версии 1.1.20. Тем не менее, он прекрасно работает в браузере запросов Mysql 1.2.17
Ответы:
Это основано на сеансе, когда установлено так, как вы сделали в своем вопросе.
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
В соответствии с этим,
FOREIGN_KEY_CHECKS
"Оба" для сферы применения. Это означает, что он может быть установлен для сессии:или глобально:
источник
На самом деле, есть две
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
источник
foreign_key_checks
и в том же сеансе ожидать, что он проигнорирует ограничения внешних ключей. Вам необходимо установить неглобальную переменную.Как объяснил Рон, есть две переменные, локальная и глобальная. Локальная переменная всегда используется и является такой же, как глобальная при подключении.
При установке переменной GLOBAL локальная переменная не изменяется ни для каких существующих соединений. Вы должны восстановить или установить локальную переменную тоже.
Возможно, не интуитивно понятный, MYSQL не применяет внешние ключи при повторном включении FOREIGN_KEY_CHECKS. Это позволяет создать несовместимую базу данных, даже если включены внешние ключи и проверки.
Если вы хотите, чтобы ваши внешние ключи были полностью согласованы, вам нужно добавить ключи, когда включена проверка.
источник
Если вы не установили GLOBAL, это затронуло только вашу сессию.
источник
У меня была та же ошибка, когда я пытался перенести базу данных Drupal на новый локальный сервер Apache (я использую XAMPP на компьютере с Windows). На самом деле я не знаю, что означает эта ошибка, но, выполнив шаги, описанные ниже, я импортировал базу данных без ошибок. Надеюсь, что это может помочь:
Изменение php.ini в C: \ xampp \ php \ php.ini
Изменение my.ini в C: \ xampp \ mysql \ bin \ my.ini
источник
В случае использования браузера запросов Mysql,
SET FOREIGN_KEY_CHECKS=0;
не оказывает влияния в версии 1.1.20. Тем не менее, он прекрасно работает в браузере запросов Mysql 1.2.17источник