MySQL удалить уникальный ключ: необходимо в ограничении внешнего ключа - PullRequest
0 голосов
/ 19 апреля 2020

Здравствуйте, у меня есть таблица, которая выглядит следующим образом

CREATE TABLE `ratings` (
  `id` bigint NOT NULL,
  `profile_id` bigint NOT NULL,
  `stars` enum('1','2','3','4','5') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `survey_id` bigint DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ratings_profile_id_email_unique` (`profile_id`,`email`),
  UNIQUE KEY `ratings_token_unique` (`token`),
  KEY `survey_id` (`survey_id`),
  CONSTRAINT `ratings_ibfk_1` FOREIGN KEY (`survey_id`) REFERENCES `surveys` (`id`),
  CONSTRAINT `ratings_profile_id_foreign` FOREIGN KEY (`profile_id`) REFERENCES `profiles` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Моя цель - удалить ключ ratings_profile_id_email_unique. Я пытался это утверждение

alter table ratings drop key ratings_profile_id_email_unique;

Это производит: Cannot drop index 'ratings_profile_id_email_unique': needed in a foreign key constraint

Что не так? Как уникальный ключ может понадобиться в ограничении fk?

1 Ответ

2 голосов
/ 19 апреля 2020

В SQL в общем случае ограничение внешнего ключа может относиться либо к первичному ключу, либо к уникальному ключу. MySQL расширяет это значение до любого индексированного столбца (столбцов), но здесь это не имеет значения.

Где-то в вашей модели данных у вас есть ссылка на внешний ключ, использующая эти два ключа вместо id. Вам необходимо исправить такие ссылки, чтобы удалить индекс.

Если вы не знаете, где это находится, вы можете использовать таблицы information_schema, такие как information_schema.referential_constraints и information_schema.key_column_usage.

Например, он получает ограничения внешнего ключа, которые ссылаются на t:

select *
from information_schema.referential_constraints rc
where rc.referenced_table_name = 't'

(Возможно, вы захотите включить в них схему. ) Это, вероятно, достаточно информации, но если вам нужно больше key_column_usage, можно указать c используемых ключей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...