2012-06-19 4 views
32

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

# 1217 - Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не удается

Как я бросаю эту таблицу?

+2

Узнайте, что другая таблица ссылается на него с помощью внешнего ключа, и сначала отбросьте ограничение FK на эту таблицу, затем отбросьте эту таблицу. –

+0

Вам нужно удалить это требование другими таблицами на тот, который вам больше не нужен – BugFinder

+1

Помогите с любым из этих ответов? http://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails http://stackoverflow.com/questions/3334619/can not-delete-or-update-a-parent-row-a-foreign-key-constraint-fail –

ответ

6

Использование show create table tbl_name для просмотра внешних ключей

Вы можете использовать этот синтаксис уронить внешний ключ:

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol

Там также более подробная информация здесь (см Frank Vanderhallen пост): http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

44

Попробуйте следующее:

SELECT * 
FROM information_schema.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_NAME = 'YourTable'; 

Это должно доставить вам, какие таблицы есть ссылки на таблицу, которую нужно отбросить, как только вы уронили эти ссылки или наборы данных, которые ссылаются на наборы данных в этой таблице вы сможете удалить таблицу

+4

Это решение лучше. Это безопаснее, и это неплохая практика, как выбранный ответ. – Sloganho

+1

это сработало для меня, этот ответ должен быть отмечен как принятый. – parvez

68

Это должно сделать трюк:

SET FOREIGN_KEY_CHECKS=0; DROP TABLE bericht; SET FOREIGN_KEY_CHECKS=1; 

Как и другие указывают, это почти никогда не то, что вы хотите, даже если это, что просил в этом вопросе. Более безопасным решением является удаление таблиц в зависимости от bericht перед удалением bericht. См. Ответ CloudMarble о том, как это сделать. Я использую bash и метод в своем сообщении, чтобы удалить все таблицы в базе данных, когда я не хочу или не могу удалить и воссоздать саму базу данных.

Ошибка #1217 возникает ошибка, когда другие таблицы имеют ограничения внешнего ключа для таблицы, которую вы пытаетесь удалить, и используете механизм базы данных InnoDB. Это решение временно отключает проверку ограничений, а затем повторно включает их. Прочтите documentation для получения дополнительной информации. Обязательно удаляйте внешние ограничения и поля в таблицах в зависимости от bericht, иначе вы можете оставить свою базу данных в неисправном состоянии.

+2

Должен быть выбран ответ – kyeno

+0

до сих пор это лучший ответ и должен быть на вершине !!!!!! –

+1

Хотя это правильно, это удивительно БЕСПЛАТНАЯ ПРАКТИКА, чтобы сделать это. Как было указано несколькими пользователями (включая Rune Kaagaard), вы должны найти ссылки, проанализировать и отбросить их по мере необходимости. – zozo

1

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

Вам нужно сначала отбросить дочернюю строку, а затем родительскую строку.

0

Я понимаю, что это черствый некоторое время, и ответ был выбран, но как об альтернативе, чтобы внешний ключ, чтобы быть NULL, а затем выберите ON DELETE SET NULL.

В принципе, ваша таблица должна быть изменена следующим образом:

ALTER TABLE 'bericht' DROP FOREIGN KEY 'your_foreign_key';

ALTER TABLE 'bericht' ADD CONSTRAINT 'your_foreign_key' FOREIGN KEY ('column_foreign_key') REFERENCES 'other_table' ('column_parent_key') ON UPDATE CASCADE ON DELETE SET NULL;

Лично я рекомендовал бы использовать как "ON UPDATE CASCADE", а также "ON DELETE SET NULL", чтобы избежать ненужные осложнения, однако ваша настройка может диктовать другой подход.

Надеюсь, это поможет.