Чи впливає MySQL Foreign_key_checks на всю базу даних?


201

Коли я виконую цю команду в MySQL:

SET FOREIGN_KEY_CHECKS=0;

Це впливає на весь двигун чи це лише моя поточна транзакція?


15
тест: увійдіть у mysql: показуйте змінні типу "% FOREIGN%"; SET FOREIGN_KEY_CHECKS = 0; Після цього увійдіть у mysql за допомогою іншої консолі. Я бачу, що показник змінних типу "% FOREIGN%" увімкнено, а не вимкнено.
Шон Нгуен

Відповіді:


246

Це базується на сеансі, коли встановлюєте, як ви зробили у своєму запитанні.

https://dev.mysql.com/doc/refman/5.7/uk/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/uk/server -system-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
Чи можете ви детальніше пояснити .... "Якщо ви хочете, щоб ваші закордонні ключі були повністю послідовними, вам потрібно додати ключі під час перевірки."
користувач2782001

4
Скажімо, у вас є таблиця з посиланням на ідентифікатори, але деякі посилаються записи відсутні. Якщо ви додасте зовнішній ключ (FK), коли FOREIGN_KEY_CHECKS увімкнено, Mysql викличе помилку і відмовиться додавати FK через порушення ланки. Коли ви додасте зовнішній ключ, поки FOREIGN_KEY_CHECKS ВИМКНЕНО, mysql продовжується без помилок. Навіть якщо ви включите чеки після цього, помилок не буде. Тепер у вас є таблиця з суперечливими даними, навіть якщо є 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.