1

我想将 an 修改index(col1, col2, col3)为 anindex(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!
4

2 回答 2

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/

于 2012-10-13T20:26:50.330 回答
0
ALTER TABLE `User` 
        ADD INDEX `idx_sid` (`sid`) USING BTREE,
        DROP INDEX `User_sid`, 
        DROP COLUMN `uid`;

这确保我们在删除旧索引sid 之前仍然有一个索引。


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

InnoDB 需要外键和引用键上的索引,以便外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会在引用表上自动创建此类索引。如果您创建另一个可用于强制外键约束的索引,则此索引可能会在稍后被静默删除。index_name,如果给定,如前所述使用。

于 2012-10-18T14:47:59.120 回答