MySQL ошибка «Невозможно сбросить индекс» при попытке ДОБАВИТЬ ИНДЕКС - PullRequest
0 голосов
/ 07 мая 2020

Я выполняю этот запрос:

ALTER TABLE `loan`
ADD INDEX `Customer ID_Bank Account` (`Customer ID`, `Bank Account`);

и получаю эту ошибку:

Error in query (1553): Cannot drop index 'Customer ID': needed in a foreign key constraint

Я очень хорошо знаю, почему нельзя удалить индекс «Идентификатор клиента»; он нужен в нескольких внешних ключах. Возникает вопрос, почему оператор ADD INDEX КОГДА-ЛИБО пытается отбросить индекс?

(И как я могу заставить его перестать пытаться отбросить этот индекс, пока я пытаюсь добавить новый?)

Моя MySQL строка версии - «5.5.60-MariaDB».

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Согласно этому отчету об ошибке MariaDB , когда MySQL создает индекс как часть создания внешнего ключа, он отмечает, что этот индекс будет автоматически удален позже, если он будет сделан. избыточным другим индексом, созданным позже.

В идеале это удаление «избыточного» индекса никогда не привело бы к сбою, но, очевидно, в MySQL есть ошибка. К счастью, есть обходной путь:

ALTER TABLE `loan`
DROP INDEX `Customer ID`,
ADD INDEX `Customer ID` (`Customer ID`);

Удалите и воссоздайте проблемный индекс в одном операторе. Если имя индекса до и после него точно такое же, MySQL не жалуется на то, что индекс удаляется; а явное создание индекса приводит к тому, что MySQL удаляет индикатор «автоматически удалить этот индекс».

0 голосов
/ 07 мая 2020

Обмен сообщениями MySQL обычно вводит меня в заблуждение.

В реляционных базах данных внешние ключи могут указывать только на:

  • Первичные ключи или
  • Уникальные ограничения. Вот и все.

В этом случае вы не говорите о первичном ключе, поэтому вам нужно уникальное ограничение (которое может называться UNIQUE INDEX или UNIQUE KEY в MySQL lin go). Слово index обычно используется для быстрого доступа к данным, но не для ссылочной целостности.

Примечание : некоторые индексы могут использоваться для обеспечения правил уникальности, с которыми не могут работать ограничения SQL, особенно частичные уникальные индексы. Но это другая история.

Вы можете создать уникальное ограничение как:

alter table loan
add constraint uq1 unique (`Customer ID`, `Bank Account`);

Полный рабочий пример может быть:

create table loan (
  id int primary key not null,
  `Customer ID` int,
  `Bank Account` int
);

alter table loan
add constraint uq1 unique (`Customer ID`, `Bank Account`);

create table item (cid int, acc int, val int,
  constraint fk1 foreign key (cid, acc) 
    references loan (`Customer ID`, `Bank Account`)
);

insert into loan (id, `Customer ID`, `Bank Account`) values (1, 20, 30); -- succeeds
insert into loan (id, `Customer ID`, `Bank Account`) values (2, 21, 31); -- succeeds
insert into loan (id, `Customer ID`, `Bank Account`) values (3, 20, 30); -- fails!

См. Рабочий пример на DB Fiddle .

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