Можно ли временно отключить ограничения в MySQL?
У меня есть две модели Django, каждая с ForeignKey к другой. Удаление экземпляров модели возвращает ошибку из-за ограничения 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()
Можно ли временно отключить ограничения и удалить?
mysql
sql
django
django-models
июль
источник
источник
ON DELETE SET NULL
? Это могло бы сделать то же самое, и вам не пришлось бы включать и выключать проверку ключа.Ответы:
Попробуй
DISABLE KEYS
илиубедитесь, что
после.
источник
disable keys
для InnodbЧтобы отключить ограничение внешнего ключа глобально, выполните следующие действия:
и не забудьте установить его обратно, когда вы закончите
ПРЕДУПРЕЖДЕНИЕ. Это следует делать только при выполнении обслуживания в однопользовательском режиме. Как это может привести к несогласованности данных. Например, это будет очень полезно, когда вы загружаете большой объем данных, используя вывод mysqldump.
источник
SET FOREIGN_KEY_CHECKS
просто изменяется значение для текущего соединения , а такжеSET GLOBAL ..
изменяется значение для всех соединений , включая будущие соединения. Если вы просто делаете этоSET FOREIGN..
в одном окне, а затем пытаетесь применить оператор в другом окне (через другое соединение), значение там не изменилось. ПриGLOBAL
этом одна и та же переменная имеет одинаковое значение для обоих соединений.ERROR 1228 (HY000): Variable 'foreign_key_checks' is a SESSION variable and can't be used with SET GLOBAL
Обычно я отключаю ограничения внешнего ключа только тогда, когда хочу обрезать таблицу, и так как я продолжаю возвращаться к этому ответу, это для будущего меня:
источник
Вместо того, чтобы отключить ограничение, навсегда измените его на ON DELETE SET NULL. Это выполнит аналогичную вещь, и вам не нужно будет включать и выключать проверку ключа. Вот так:
Прочитайте это ( 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 ).
источник
FOREIGN_KEY_CHECKS
0 и вернуть его после завершения грязной работы. Кроме того, это может заблокировать для записи ваших таблиц.Чтобы отключить ограничение внешнего ключа глобально:
и для активного ограничения внешнего ключа
источник
Очень простое решение с phpmyadmin:
источник
SET FOREIGN_KEY_CHECKS=0; ..... SET FOREIGN_KEY_CHECKS=1;
не работало для меня в PHPMyAdmin, потому что я забыл снять флажок «Включить проверки внешнего ключа». В PHPMyAdmin вы можете пропустить эти команды SET и просто снять флажок.Для меня просто
SET FOREIGN_KEY_CHECKS=0;
было недостаточно. Я все еще имелcom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
.Я должен был добавить
ALTER TABLE myTable DISABLE KEYS;
.Так:
источник
Если ключевое поле имеет значение NULL, то вы также можете установить значение NULL, прежде чем пытаться удалить его:
источник
В phpMyAdmin вы можете выбрать несколько строк, а затем нажать кнопку удаления. Вы попадете на экран со списком запросов на удаление, вы можете снять флажок проверки внешнего ключа и нажать Да, чтобы выполнить их.
Это позволит вам удалять строки, даже если есть ограничение ON DELETE.
источник
Не стоит устанавливать ограничение внешнего ключа равным 0, потому что если вы это сделаете, ваша база данных не будет гарантировать, что она не нарушает ссылочную целостность. Это может привести к неточным, вводящим в заблуждение или неполным данным.
Вы делаете внешний ключ по причине: потому что все значения в дочернем столбце должны совпадать со значением в родительском столбце. Если нет ограничений внешнего ключа, дочерняя строка может иметь значение, которого нет в родительской строке, что может привести к неточным данным.
Например, предположим, у вас есть веб-сайт для входа в систему студентов, и каждый студент должен зарегистрировать учетную запись в качестве пользователя. У вас есть одна таблица для идентификаторов пользователей, с идентификатором пользователя в качестве первичного ключа; и еще одна таблица для учетных записей студентов с идентификатором студента в виде столбца. Поскольку у каждого учащегося должен быть идентификатор пользователя, имеет смысл сделать идентификатор студента из таблицы учетных записей студентов внешним ключом, который ссылается на идентификатор пользователя первичного ключа в таблице идентификаторов пользователей. Если нет никаких проверок внешнего ключа, у ученика может быть идентификатор ученика и нет идентификатора пользователя, что означает, что ученик может получить учетную запись, не будучи пользователем, что неправильно.
Представьте, если это произойдет с большим количеством данных. Вот почему вам нужна проверка внешнего ключа.
Лучше всего выяснить, что является причиной ошибки. Скорее всего, вы пытаетесь удалить из родительской строки, не удаляя из дочерней строки. Попробуйте удалить из дочерней строки перед удалением из родительской строки.
источник