Как временно отключить ограничение внешнего ключа в MySQL?

возможно ли временно отключить ограничения в MySQL?

У меня есть две модели Django, каждая с иностранным ключом к другой. Удаление экземпляров модели возвращает ошибку из-за ограничения ForeignKey:

cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed()  #a foreign key constraint fails here

cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()

можно ли временно отключить ограничения и удалить их в любом случае?

9 ответов


попробовать DISABLE KEYS или

SET FOREIGN_KEY_CHECKS=0;

обязательно

SET FOREIGN_KEY_CHECKS=1;

после.


чтобы отключить ограничение внешнего ключа глобально, выполните следующие действия:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

и не забудьте установить его обратно, когда вы сделали

SET GLOBAL FOREIGN_KEY_CHECKS=1;

предупреждение: вы должны делать это только при выполнении обслуживания в однопользовательском режиме. Как это может привести к несогласованности данных. Например, это будет очень полезно, когда вы загружаете большой объем данных с помощью вывода mysqldump.


обычно я отключаю ограничения внешнего ключа только тогда, когда хочу усечь таблицу, и поскольку я продолжаю возвращаться к этому ответу, это для будущего меня:

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE table;
SET FOREIGN_KEY_CHECKS=1;

вместо отключения ограничения измените его на ON DELETE SET NULL. Это приведет к аналогичной вещи, и вам не придется включать и выключать ключ. Вот так:

ALTER TABLE tablename1 DROP FOREIGN KEY fk_name1; //get rid of current constraints
ALTER TABLE tablename2 DROP FOREIGN KEY fk_name2;

ALTER TABLE tablename1 
  ADD FOREIGN KEY (table2_id) 
        REFERENCES table2(id)
        ON DELETE SET NULL  //add back constraint

ALTER TABLE tablename2 
  ADD FOREIGN KEY (table1_id) 
        REFERENCES table1(id)
        ON DELETE SET NULL //add back other constraint

прочтите это (http://dev.mysql.com/doc/refman/5.5/en/alter-table.html) и это (http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html).


чтобы отключить ограничение внешнего ключа глобально:

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

и для активного ограничения внешнего ключа

SET GLOBAL FOREIGN_KEY_CHECKS = 1;

очень простое решение с phpmyadmin: в вашей таблице перейдите на вкладку SQL, после редактирования команды SQL, которую вы хотите запустить, рядом с GO есть флажок "Включить проверки внешнего ключа".Отключите этот флажок и запустите SQL. Затем он будет автоматически перепроверен.


Если ключевое поле nullable, то вы также можете установить значение null перед попыткой удалить его:

cursor.execute("UPDATE myapp_item SET myapp_style_id = NULL WHERE n = %s", n)
transaction.commit_unless_managed() 

cursor.execute("UPDATE myapp_style SET myapp_item_id = NULL WHERE n = %s", n)
transaction.commit_unless_managed()

cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed()

cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()

в phpMyAdmin вы можете выбрать несколько строк, затем нажмите действие удалить. Вы войдете в экран, на котором перечислены запросы на удаление, вы можете снять флажок проверка внешнего ключа и нажать "Да", чтобы выполнить их.

Это позволит вам удалить строки, даже если есть ограничение на удаление.


Не рекомендуется устанавливать ограничение внешнего ключа в 0, потому что в этом случае ваша база данных не будет гарантировать, что она не нарушает ссылочную целостность. Это может привести к неточным, вводящим в заблуждение или неполным данным.

вы создаете внешний ключ по причине: потому что все значения в дочернем столбце должны совпадать со значением в Родительском столбце. Если нет ограничений внешнего ключа, дочерняя строка может иметь значение, которое не находится в родительской строке, что приведет к неточные данные.

например, предположим, у вас есть веб-сайт для входа студентов, и каждый студент должен зарегистрироваться для учетной записи в качестве пользователя. У вас есть одна таблица для идентификаторов пользователей, с идентификатором пользователя в качестве первичного ключа; и другая таблица для учетных записей студентов, с идентификатором студента в качестве столбца. Поскольку каждый студент должен иметь идентификатор пользователя, имеет смысл сделать идентификатор студента из таблицы учетные записи студентов внешним ключом, который ссылается на идентификатор пользователя первичного ключа в таблице идентификаторы пользователей. Если есть нет проверки внешнего ключа, у студента может быть идентификатор студента и нет идентификатора пользователя, что означает, что студент может получить учетную запись, не будучи пользователем, что неправильно.

представьте, если это происходит с большим количеством данных. Вот почему вам нужна проверка внешнего ключа.

лучше всего выяснить, что вызывает ошибку. Скорее всего, вы пытаетесь удалить из родительской строки без удаления из дочерней строки. Попробуйте удалить из дочерней строки перед удалением из родительской ряд.