使用名称中的逗号删除索引

时间:2014-05-01 13:12:56

标签: mysql mysql-error-1091

我有一个表(好吧有很多),索引包含一个逗号

....
FULLTEXT KEY `description` (`description`),
  FULLTEXT KEY `description,title` (`description`,`title`), -- <-- HERE
  FULLTEXT KEY `content` (`content`),
  FULLTEXT KEY `content,title` (`content`,`title`)
) ENGINE=MyISAM AUTO_INCREMENT=150296 DEFAULT CHARSET=utf8

我正在转向InnoDB + sphinx,所以想要删除所有FULLTEXT索引,这些都证明是个问题。

行情:

DROP INDEX 'content,title' ON `table`
ALTER TABLE `table` DROP INDEX 'content,title'

反引号:     DROP INDEX content,title ON table     ALTER TABLE table DROP INDEX content,title

转义:     ALTER TABLE articles DROP INDEX description\,title

各种形式的逃避,也尝试使用LIKE和野性角色。

实际错误:Can't DROP 'description,title'; check that column/key exists

@CodeBird

SELECT * FROM information_schema.STATISTICS WHERE TABLE_NAME='articles' AND TABLE_SCHEMA='test' AND INDEX_NAME LIKE 'descri%'\G
*************************** 1. row ***************************
TABLE_CATALOG: NULL
 TABLE_SCHEMA: test
   TABLE_NAME: articles
   NON_UNIQUE: 1
 INDEX_SCHEMA: test
   INDEX_NAME: description,title
 SEQ_IN_INDEX: 1
  COLUMN_NAME: description
    COLLATION: NULL
  CARDINALITY: NULL
     SUB_PART: NULL
       PACKED: NULL
     NULLABLE: YES
   INDEX_TYPE: FULLTEXT
      COMMENT:
*************************** 2. row ***************************
TABLE_CATALOG: NULL
 TABLE_SCHEMA: test
   TABLE_NAME: articles
   NON_UNIQUE: 1
 INDEX_SCHEMA: test
   INDEX_NAME: description,title
 SEQ_IN_INDEX: 2
  COLUMN_NAME: title
    COLLATION: NULL
  CARDINALITY: NULL
     SUB_PART: NULL
       PACKED: NULL
     NULLABLE: YES
   INDEX_TYPE: FULLTEXT
      COMMENT:
2 rows in set (0.00 sec)

3 个答案:

答案 0 :(得分:2)

拥有root访问权限,您应该能够在information_schema中更新索引名称,然后尝试删除它们:

UPDATE information_schema.STATISTICS SET INDEX_NAME='to_be_dropped' 
WHERE TABLE_NAME='articles' AND TABLE_SCHEMA='test' 
AND INDEX_NAME LIKE 'descri%'

答案 1 :(得分:0)

下面的命令应该有效,如果收到任何错误,请再次检查并分享:

ALTER TABLE `mytable` DROP INDEX `content,title`;

你可以查看下面的sqlfiddle:首先构建上面的语句,然后使用上面的语句,它将成功删除索引。 fulltext index drop

答案 2 :(得分:0)

表和列名称必须使用反引号引用,但您使用的是单引号。 (你在其他地方正确使用反引号)。

变化:

DROP INDEX 'content,title' ON `table`;
ALTER TABLE `table` DROP INDEX 'content,title';

要:

DROP INDEX `content,title` ON `table`;
ALTER TABLE `table` DROP INDEX `content,title`;

另外,我建议你不要使用需要引用的表/列/索引名称,因为它是一个麻烦且容易出错的,正如你所见。索引名称content_title而不是content,title可以为您节省这些麻烦。