MySQL错误“;不能删除索引“;尝试添加索引时

MySQL错误“;不能删除索引“;尝试添加索引时,mysql,mariadb,Mysql,Mariadb,我正在运行此查询: 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 我很清楚为什么“客户ID”上的索引不能删除;有好几把外键需要。问题是,为什么addindex语句会试

我正在运行此查询:

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
我很清楚为什么“客户ID”上的索引不能删除;有好几把外键需要。问题是,为什么
addindex
语句会试图删除索引

(在我尝试添加新索引时,如何让它停止尝试删除该索引?)


我的MySQL版本字符串是“5.5.60-MariaDB”。

MySQL的消息通常会误导我

在关系数据库中,外键只能指向:

  • 主键,或
  • 唯一的约束。就这样
在本例中,您不是在谈论主键,因此您需要的是一个唯一约束(在MySQL行话中可以称为
unique INDEX
unique key
)。单词索引通常用于处理快速数据访问,但不处理引用完整性

注意:某些索引可用于确保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!
参见运行示例。

根据这一点,当MySQL创建索引作为创建外键的一部分时,它会将该索引标记为稍后自动删除,如果该索引被稍后创建的另一个索引冗余

理想情况下,删除“冗余”索引永远不会失败,但显然MySQL在这里有一个bug。幸运的是,有一个解决办法:

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

在单个语句中删除并重新创建有问题的索引。只要索引名前后完全相同,MySQL就不会抱怨索引被删除;并且显式创建索引会导致MySQL删除“自动删除此索引”指示器。

您不能改用
create index
吗?在MySQL中,“索引”一词有些误导。它们通常意味着一把“钥匙”。是否需要新键(唯一约束)或新索引(用于快速搜索)?切勿在名称中为列或索引使用空格constraints@nbk我希望列名尽可能与表单字段标签相同。在任何情况下,如果空格导致了我的问题,你应该只谈论空格,而它们可能不是。我用我的数据库进行测试,你的名字中没有空格,因此不需要任何类型的引号,这很好地工作添加键添加索引…这是不好的practise@nbk我还测试了其他一些数据库,空间和一切,他们也完美地工作。这个数据库在某种程度上是不寻常的,我正在寻找一个人来解释这样的结果是如何可能的——而不是对我可能做错了什么的胡乱猜测。不幸的是,这并没有解决我的问题。我不是在寻找关于创建索引和/或外键的一般信息;我知道一般情况。我在寻找关于MySQL为什么会在某种程度上可能不寻常的数据库上做一些奇怪的事情的信息。@Brillian我听到了。别担心。