不知道列索引名称如何删除MySQL列索引

3
我是一名有用的助手,可以为您翻译文本。
我有一个应用程序,使用Hibernate支持Oracle和MySQL数据库。更新后,我必须手动删除一些带有索引/约束条件的列。这些索引具有由Hibernate生成的随机名称。
在Oracle中,我可以这样做:
ALTER TABLE table_name DROP (column_name) CASCADE CONSTRAINTS;

很遗憾,MySQL不支持这个功能。有没有可能做类似这样的事情?
DROP INDEX (SELECT Key_name FROM (SHOW INDEX FROM table_name WHERE Column_name = 'column_name')) ON table_name;

在我删除该列之前需要做什么?

编辑:这应该可以在 SQL 脚本中无需用户交互完成。

3个回答

4

您可以从information_schema中为表选择索引:

SELECT DISTINCT INDEX_NAME, TABLE_NAME, TABLE_SCHEMA FROM information_schema.STATISTICS;

0

要获取特定数据库的所有索引(将<Database_Name>替换为您的数据库名称),请使用:

SELECT DISTINCT INDEX_NAME 
FROM information_schema.STATISTICS 
WHERE TABLE_SCHEMA LIKE '<Database_Name>';

要获取特定数据库中表格的所有索引(将<Table_Name>替换为您的表格名称),请使用以下代码:

SELECT DISTINCT INDEX_NAME 
FROM information_schema.STATISTICS 
WHERE TABLE_SCHEMA LIKE '<Database_Name>' AND 
    TABLE_NAME LIKE '<Table_Name>';

要获取特定数据库中表的特定列(将<Column_Name>替换为您的列名)的所有索引,请使用以下代码:

SELECT DISTINCT INDEX_NAME 
FROM information_schema.STATISTICS 
WHERE TABLE_SCHEMA LIKE '<Database_Name>' AND
     TABLE_NAME LIKE '<Table_Name>' AND 
     COLUMN_NAME LIKE '<Column_Name>';

除此之外,您还可以在LIKE运算符中使用任何通配符来获取特定的记录,例如:

SELECT DISTINCT INDEX_NAME 
FROM information_schema.STATISTICS 
WHERE TABLE_SCHEMA LIKE '<Database_Name>' AND 
    TABLE_NAME LIKE 'tbl_prefix_%';

0

无需手动删除索引,MySQL 5.7 参考手册 中提到:

如果从表中删除列,则这些列也将从任何包含它们的索引中删除。如果组成索引的所有列都被删除,则该索引也将被删除。如果您使用 CHANGE 或 MODIFY 缩短了一个具有索引的列,并且生成的列长度小于索引长度,则 MySQL 会自动缩短索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接