Мне нужно изменить мою существующую базу данных, чтобы добавить столбец. Следовательно, я также хочу обновить поле 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
UNIQUE KEY AID
на mytable?Ответы:
Вы должны сбросить внешний ключ. Внешние ключи в MySQL автоматически создают индекс для таблицы (был задан вопрос SO ).
источник
mytable
удаления индекса: ALTER TABLE ADD CONSTRAINTmytable_ibfk_1
FOREIGN KEY (AID
) REFERENCESmytable_a
(ID
) ON DELETE CASCADE;FOREIGN KEY
ограничение было анонимным?Шаг 1
Перечислите внешний ключ (обратите внимание, что он отличается от имени индекса)
Результат покажет вам имя внешнего ключа.
Формат:
Шаг 2
Drop (внешний / первичный / ключ) ключ
Шаг 3
Брось индекс.
источник
Если вы имеете в виду, что вы можете сделать это:
Но потом:
дает ошибку.
Вы можете удалить индекс и создать новый в одном
ALTER TABLE
выражении:источник
Поскольку у вас должен быть индекс для поля внешнего ключа, вы можете просто создать простой индекс для поля «AID».
и только потом сбросить уникальный индекс 'AID'
источник
Внешний ключ всегда требует индекса. Без индекса, обеспечивающего ограничение, потребовалось бы полное сканирование таблицы в ссылочной таблице для каждого вставленного или обновленного ключа в ссылочной таблице. И это будет иметь недопустимое влияние на производительность. Это имеет следующие 2 последствия:
источник
Я думаю, что это простой способ отбросить индекс.
источник
FOREIGN_KEY_CHEK=0
и в концеFOREIGN_KEY_CHEK=1
.В моем случае я удалил внешний ключ и все еще не мог удалить индекс. Это было потому, что была еще одна таблица с внешним ключом этой таблицы в тех же полях. После того, как я удалил внешний ключ в другой таблице, я мог удалить индексы в этой таблице.
источник
Если вы хотите удалить столбец с внешним ключом (с ограничением), сначала вы должны удалить внешний ключ, а затем удалить столбец. Когда вы удаляете внешний ключ, вам не нужно передавать все имя, просто передайте внешний ключ. имя столбца:
более подробная информация о:
https://laravel.com/docs/6.x/migrations#foreign-key-constraints
источник