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

<p>можно ли временно отключить ограничения в mysql?</p><p>у меня есть две модели django, каждая с foreignkey к другой. удаление экземпляров модели возвращает ошибку из-за ограничения foreignkey:</p><pre><code>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() </code></pre><p>можно ли временно отключить ограничения и удалить?</p>

<p>попробуйте <code>disable keys</code> или </p><pre><code>set foreign\_key\_checks=0; </code></pre><p>убедись в</p><pre><code>set foreign\_key\_checks=1; </code></pre><p>после.</p>

<p>чтобы отключить ограничение внешнего ключа глобально, выполните следующие действия:</p><pre><code>set global foreign\_key\_checks=0; </code></pre><p>и не забудьте установить его обратно, когда вы закончите</p><pre><code>set global foreign\_key\_checks=1; </code></pre><p>предупреждение. это следует делать только при выполнении обслуживания в однопользовательском режиме. как это может привести к несогласованности данных. например, это будет очень полезно, когда вы загружаете большой объем данных, используя вывод mysqldump.</p>

<p>обычно я отключаю ограничения внешнего ключа только тогда, когда хочу обрезать таблицу, и так как я продолжаю возвращаться к этому ответу, это для будущего меня:</p><pre><code>set foreign\_key\_checks=0; truncate table table; set foreign\_key\_checks=1; </code></pre>

<p>вместо того, чтобы отключить ограничение, навсегда измените его на on delete set null. это выполнит аналогичную вещь, и вам не нужно будет включать и выключать проверку ключа. вот так:</p><pre><code>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 </code></pre><p>прочитайте это ( <a href="http://dev.mysql.com/doc/refman/5.5/en/alter-table.html">http://dev.mysql.com/doc/refman/5.5/en/alter-table.html</a> ) и это ( <a href="http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html">http://dev.mysql.com/doc /refman/5.5/en/create-table-foreign-keys.html</a> ).</p>

<p>чтобы отключить ограничение внешнего ключа глобально:</p><pre><code>set global foreign\_key\_checks = 0; </code></pre><p>и для активного ограничения внешнего ключа</p><pre><code>set global foreign\_key\_checks = 1; </code></pre>

<p>очень простое решение с помощью phpmyadmin: в вашей таблице перейдите на вкладку sql, после того как вы отредактируете команду sql, которую хотите запустить, рядом с go есть флажок «включить проверки внешнего ключа». отключите этот флажок и запустите sql. затем он будет автоматически перепроверен.</p>

<p>если ключевое поле имеет значение null, то вы также можете установить значение null, прежде чем пытаться удалить его:</p><pre><code>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() </code></pre>

<p>для меня просто <code>set foreign\_key\_checks=0;</code> было недостаточно .. у меня все еще был <code>com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityconstraintviolationexception</code>.</p><p>я должен был добавить <code>alter table mytable disable keys;</code>.</p><p>так:</p><pre><code>set foreign\_key\_checks=0; alter table mytable disable keys; delete from mytable; alter table mytable enable keys; set foreign\_key\_checks=1; </code></pre>

<p>не стоит устанавливать ограничение внешнего ключа равным 0, потому что если вы это сделаете, ваша база данных не будет гарантировать, что она не нарушает ссылочную целостность. это может привести к неточным, вводящим в заблуждение или неполным данным.</p><p>вы делаете внешний ключ по причине: потому что все значения в дочернем столбце должны совпадать со значением в родительском столбце. если нет ограничений внешнего ключа, дочерняя строка может иметь значение, которого нет в родительской строке, что может привести к неточным данным.</p><p>например, предположим, у вас есть веб-сайт для входа в систему студентов, и каждый студент должен зарегистрировать учетную запись в качестве пользователя. у вас есть одна таблица для идентификаторов пользователей, с идентификатором пользователя в качестве первичного ключа; и еще одна таблица для учетных записей студентов с идентификатором студента в виде столбца. поскольку у каждого учащегося должен быть свой идентификатор пользователя, имеет смысл сделать идентификатор студента из таблицы учетных записей студентов внешним ключом, который ссылается на идентификатор пользователя первичного ключа в таблице идентификаторов пользователей. если нет никаких проверок внешнего ключа, у ученика может быть идентификатор ученика и нет идентификатора пользователя, что означает, что ученик может получить учетную запись, не будучи пользователем, что неправильно.</p><p>представьте, если это произойдет с большим количеством данных. вот почему вам нужна проверка внешнего ключа.</p><p>лучше всего выяснить, что является причиной ошибки. скорее всего, вы пытаетесь удалить из родительской строки, не удаляя из дочерней строки. попробуйте удалить из дочерней строки перед удалением из родительской строки. </p>

<p>в phpmyadmin вы можете выбрать несколько строк, а затем нажать действие удаления. вы попадете на экран со списком запросов на удаление, вы можете снять галочку с галочки и нажать «да», чтобы выполнить их. </p><p>это позволит вам удалять строки, даже если есть ограничение on delete. </p>