it-swarm.com.ru

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

Можно ли временно отключить ограничения в 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()

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

530
jul

Попробуйте DISABLE KEYS или 

SET FOREIGN_KEY_CHECKS=0;

убедись в

SET FOREIGN_KEY_CHECKS=1;

после.

1255
Andrew Campbell

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

SET GLOBAL FOREIGN_KEY_CHECKS=0;

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

SET GLOBAL FOREIGN_KEY_CHECKS=1;

ПРЕДУПРЕЖДЕНИЕ. Это следует делать только при выполнении обслуживания в однопользовательском режиме. Как это может привести к несогласованности данных. Например, это будет очень полезно, когда вы загружаете большой объем данных, используя вывод mysqldump.

116
berniey

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

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

Вместо того, чтобы отключить ограничение, навсегда измените его на 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 ).

24
dnagirl

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

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

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

SET GLOBAL FOREIGN_KEY_CHECKS = 1;
8
Umar Tariq

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

6
svin

Если ключевое поле имеет значение NULL, то вы также можете установить значение 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()
3
Chanoch

Для меня просто SET FOREIGN_KEY_CHECKS=0; было недостаточно .. У меня все еще был com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException.

Я должен был добавить ALTER TABLE myTable DISABLE KEYS;.

Так:

SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE myTable DISABLE KEYS;
DELETE FROM myTable;
ALTER TABLE myTable ENABLE KEYS;
SET FOREIGN_KEY_CHECKS=1;
1
RotS

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

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

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

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

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

0
Valencia Starr

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

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

0
Julian