MySQL Не удается удалить индекс, необходимый для ограничения внешнего ключа

Мне нужно добавить ALTER мою существующую базу данных, чтобы добавить столбец. Следовательно, я также хочу обновить поле UNIQUE, чтобы включить этот новый столбец. Я пытаюсь удалить текущий индекс, но продолжаю получать ошибку. MySQL Cannot drop index needed in a foreign key constraint

 CREATE TABLE mytable_a ( ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(255) NOT NULL, UNIQUE(Name) ) ENGINE=InnoDB; CREATE TABLE mytable_b ( ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(255) NOT NULL, UNIQUE(Name) ) ENGINE=InnoDB; CREATE TABLE mytable_c ( ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(255) NOT NULL, UNIQUE(Name) ) ENGINE=InnoDB; CREATE TABLE `mytable` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `AID` tinyint(5) NOT NULL, `BID` tinyint(5) NOT NULL, `CID` tinyint(5) NOT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `AID` (`AID`,`BID`,`CID`), KEY `BID` (`BID`), KEY `CID` (`CID`), CONSTRAINT `mytable_ibfk_1` FOREIGN KEY (`AID`) REFERENCES `mytable_a` (`ID`) ON DELETE CASCADE, CONSTRAINT `mytable_ibfk_2` FOREIGN KEY (`BID`) REFERENCES `mytable_b` (`ID`) ON DELETE CASCADE, CONSTRAINT `mytable_ibfk_3` FOREIGN KEY (`CID`) REFERENCES `mytable_c` (`ID`) ON DELETE CASCADE ) ENGINE=InnoDB; mysql> ALTER TABLE mytable DROP INDEX AID; ERROR 1553 (HY000): Cannot drop index 'AID': needed in a foreign key constraint 

Вам нужно сбросить внешний ключ. Внешние ключи в MySQL автоматически создают индекс в таблице (был вопрос SO на тему).

 ALTER TABLE mytable DROP FOREIGN KEY mytable_ibfk_1 ; 

Шаг 1

Перечислите внешний ключ (обратите внимание, что его отличие от имени индекса)

 SHOW CREATE TABLE 

Результат покажет вам имя внешнего ключа.

Шаг 2

Кнопка Drop (Foreign / primary / key)

 ALTER TABLE  DROP FOREIGN KEY 

Шаг 3

Отбросьте индекс.

Если вы имеете в виду, что вы можете это сделать:

 CREATE TABLE mytable_d ( ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(255) NOT NULL, UNIQUE(Name) ) ENGINE=InnoDB; ALTER TABLE mytable ADD COLUMN DID tinyint(5) NOT NULL, ADD CONSTRAINT mytable_ibfk_4 FOREIGN KEY (DID) REFERENCES mytable_d (ID) ON DELETE CASCADE; > OK. 

Но потом:

 ALTER TABLE mytable DROP KEY AID ; 

дает ошибку.


Вы можете удалить индекс и создать новый в одном выражении ALTER TABLE :

 ALTER TABLE mytable DROP KEY AID , ADD UNIQUE KEY AID (AID, BID, CID, DID); 

Поскольку у вас должен быть индекс в поле внешнего ключа, вы можете просто создать простой индекс в поле «AID»,

 CREATE INDEX aid_index ON mytable (AID); 

и только затем отбросить уникальный индекс ‘AID’

 ALTER TABLE mytable DROP INDEX AID; 

Я думаю, что это простой способ сбросить индекс.

 set FOREIGN_KEY_CHECKS=1; ALTER TABLE mytable DROP INDEX AID; set FOREIGN_KEY_CHECKS=0; 
  • Как вы отлаживаете хранимые процедуры MySQL?
  • MySQL DROP все таблицы, игнорируя foreign keys
  • как получить список баз данных «Схема» имен MySql с помощью java JDBC
  • Как нечеткое соответствие электронной почте или телефону Elasticsearch?
  • Подавлять предупреждения с помощью mysql из терминала, но пароль написан в сценарии bash
  • Как использовать MySql User Defined Variable в .NET MySqlCommand?
  • DOUBLE vs DECIMAL в MySQL
  • Mysql localhost! = 127.0.0.1?
  • Как выполнить mysqldump без подсказки пароля?
  • Как установить значение по умолчанию для столбца MySQL Datetime?
  • Как установить формат экспорта таблицы по умолчанию в Workbench MySQL?
  • Interesting Posts

    Получить последнее вставленное значение из базы данных sqlite Android

    в чем разница между «супер» и «расширением» в Java Generics

    Как экспортировать установленный драйвер устройства в Windows 7 для последующего использования?

    Объединение таблицы данных в соответствии с диапазонами дат

    Создание интерфейса FORTRAN для функции C, которая возвращает символ char *

    Очистка после всех тестов junit

    Как добавить gradleиент к тексту UILabel, но не к фону?

    Обновление GUI (WPF) с использованием другого streamа

    как я могу добавить файл helpl в студию Android (из примера выставления счетов в приложении)

    Зачем создавать много разделов?

    В чем разница между архитектурой Intel (CISC) и ARM (RISC)?

    Почему Windows 7 устанавливает 64-разрядные приложения в папку Program Files (x86)? Могу ли я изменить поведение?

    Excel interop: рабочий стол или рабочий лист?

    Ошибка 619 при попытке подключения к клиенту Windows VPN

    Изображение теряет исходный результат при передаче его другому действию

    Давайте будем гением компьютера.