如何删除mySQL中引用多列的外键

如何删除mySQL中引用多列的外键,mysql,foreign-keys,Mysql,Foreign Keys,我有一个外键,它引用子表中的两列。我想删除外键,但mySQL只是挂起,什么也没发生: 以下是“显示创建表\u名称”的输出: 关键FK_动物指数(动物类型、食物指数), 约束FK_动物索引外键(动物类型、食物索引) 参考动物种类表(动物种类、食物指数) 引擎=InnoDB 我已尝试使用以下方法删除此外键: `ALTER TABLE table_name DROP FOREIGN KEY FK_animal_index;` `ALTER TABLE table_name DROP FOREIGN

我有一个外键,它引用子表中的两列。我想删除外键,但mySQL只是挂起,什么也没发生:

以下是“显示创建表\u名称”的输出:

关键FK_动物指数(动物类型、食物指数),
约束FK_动物索引外键(动物类型、食物索引)
参考动物种类表(动物种类、食物指数)
引擎=InnoDB

我已尝试使用以下方法删除此外键:

`ALTER TABLE table_name DROP FOREIGN KEY FK_animal_index;`

`ALTER TABLE table_name DROP FOREIGN KEY animal_type;`
ALTER TABLE section\u configuration DROP外键FK\u animal\u index,
下拉键(动物类型、食物索引)

ALTER TABLE section\u configuration DROP FOREIGN KEY
FK\u animal\u index
,添加约束FK\u animal\u type FOREIGN KEY(animal\u type)REFERENCES
animal\u schedules
animal\u type
)ON DELETE SET NULL

其他人提到,未设置ON DELETE会阻止您更改键值(如果ON DELETE未设置为任何值,mySQL将拒绝更改)


但是没有用,mySQL只是挂起,30分钟后仍然什么都没有。数据库目前非常小,因此删除FK应该很快。

这个问题的答案根本不是关于主键。 我不得不停止我的程序访问该表,以便对其进行修改。
在mySQL db中,您可以随时添加表和列,但如果要更改列或删除列,任何程序都不能使用它,否则它将无限期挂起。

我猜它正在等待访问表。如果有任何未完成的事务在其他会话中运行,ALTER TABLE必须等待它们完成,然后才能开始对该表执行任何操作。这称为元数据锁。任何查询了该表并未提交其事务的会话都可以无限期地阻止ALTER表。是的,看起来您是正确的。我可以插入、更新和选择记录,但在停止任何程序访问数据库之前,我无法更改表。我停止了我的程序并使用:
ALTER TABLE section_configuration DROP FOREIGN KEY FK_animal_index,ADD CONSTRAINT FK_animal_type外键(animal_type)在DELETE SET NULL上引用animal_schedules(animal_type)成功了。非常感谢Karwin先生