如何更改参与外键的索引?

时间:2012-10-13 20:20:47

标签: mysql sql

我想将index(col1, col2, col3)修改为index(col1),而不会在col1上激怒外键。我该怎么做?

我的方法是删除并创建索引。但是在它做的时候它没有使用外键。升级和还原架构的步骤是什么?


原件:

  `sid` int(11) NOT NULL DEFAULT '0',
  `cid` int(11) NOT NULL DEFAULT '0',
  `uid` int(11) NOT NULL DEFAULT '0',
  ...
  UNIQUE KEY `User_sid` (`sid`,`cid`,`uid`),
  ...
  CONSTRAINT `User_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `SolrMap` (`sid`)

目标:

  ...,
  `sid` int(11) NOT NULL DEFAULT '0',
  `cid` int(11) NOT NULL DEFAULT '0',       ####ONE LESS COLUMN
  `password_reset_valid_until` datetime DEFAULT NULL,
  `password_reset_id` char(24) DEFAULT NULL,
  ...
  KEY `User_sid` (`sid`)  ####NEW KEY
  ####WANT NEW FOREIGN KEY

这就是我尝试过的失败:

ALTER TABLE `User` 
        DROP INDEX `User_sid`, 
        ADD INDEX `User_sid` (`sid`) USING BTREE,
        DROP COLUMN `uid`;

这就是它失败的原因:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
121013  8:27:39 Error in foreign key constraint of table friday/User:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
  CONSTRAINT "User_ibfk_1" FOREIGN KEY ("sid") REFERENCES "SolrMap" ("sid")
InnoDB: Renaming table `friday`.<result 2 when explaining filename '#sql-6fd_2f12e'> to `friday`.`User` failed!

2 个答案:

答案 0 :(得分:0)

您是否尝试过禁用外键检查或约束

 SET foreign_key_checks = 0;

 ALTER TABLE `User` 
    DROP INDEX `User_sid`, 
    ...........

 SET foreign_key_checks = 1;

了解更多http://gauravsohoni.wordpress.com/2009/03/09/mysql-disable-foreign-key-checks-or-constraints/

答案 1 :(得分:0)

ALTER TABLE `User` 
        ADD INDEX `idx_sid` (`sid`) USING BTREE,
        DROP INDEX `User_sid`, 
        DROP COLUMN `uid`;

这可确保我们在<{1}} 之前仍然有一个索引我们会删除旧索引。


来自http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

  

InnoDB需要外键和引用键的索引   外键检查可以很快,不需要表扫描。在里面   引用表,必须有一个索引所在的外键   列列为同一订单中的第一列。这样的   如果不是,则会自动在引用表上创建索引   存在。如果您创建,可能会稍后以静默方式删除此索引   另一个可用于强制执行外键约束的索引。   如果给定,则使用index_name,如前所述。