我需要修改我现有的数据库来添加一个列。因此,我还想更新UNIQUE字段以包含新列。我试图删除当前索引,但一直得到错误MySQL不能删除索引需要在一个外键约束

CREATE TABLE mytable_a (
ID          TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name        VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;

CREATE TABLE mytable_b (
ID          TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name        VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;

CREATE TABLE mytable_c (
ID          TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name        VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;


CREATE TABLE `mytable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `AID` tinyint(5) NOT NULL,
  `BID` tinyint(5) NOT NULL,
  `CID` tinyint(5) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `AID` (`AID`,`BID`,`CID`),
  KEY `BID` (`BID`),
  KEY `CID` (`CID`),
  CONSTRAINT `mytable_ibfk_1` FOREIGN KEY (`AID`) REFERENCES `mytable_a` (`ID`) ON DELETE CASCADE,
  CONSTRAINT `mytable_ibfk_2` FOREIGN KEY (`BID`) REFERENCES `mytable_b` (`ID`) ON DELETE CASCADE,
  CONSTRAINT `mytable_ibfk_3` FOREIGN KEY (`CID`) REFERENCES `mytable_c` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB;




mysql> ALTER TABLE mytable DROP INDEX AID;
ERROR 1553 (HY000): Cannot drop index 'AID': needed in a foreign key constraint

当前回答

如果你的意思是你可以这样做:

CREATE TABLE mytable_d (
ID          TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name        VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;


ALTER TABLE mytable
ADD COLUMN DID tinyint(5) NOT NULL,
ADD CONSTRAINT mytable_ibfk_4 
      FOREIGN KEY (DID) 
        REFERENCES mytable_d (ID) ON DELETE CASCADE;

 > OK.

但之后:

ALTER TABLE mytable
DROP KEY AID ;

给错误。


你可以在ALTER TABLE语句中删除索引并创建一个新的索引:

ALTER TABLE mytable
DROP KEY AID ,
ADD UNIQUE KEY AID (AID, BID, CID, DID);

其他回答

我认为这是一个简单的方法来删除索引。

set FOREIGN_KEY_CHECKS=0; //disable checks

ALTER TABLE mytable DROP INDEX AID;

set FOREIGN_KEY_CHECKS=1; //enable checks

因为你必须在外键字段上有一个索引你可以在AID字段上创建一个简单的索引

CREATE INDEX aid_index ON mytable (AID);

然后才删除唯一索引'AID'

ALTER TABLE mytable DROP INDEX AID;

目前得到最多好评的答案并不完整。 需要删除所有“source”列也出现在UNIQUE KEY声明中的外键。 因此,在这种情况下,删除mytable_ibfk_1是不足以消除错误的,mytable_ibfk_2和mytable_ibfk_3也必须删除。 这是完整的答案:

    ALTER TABLE mytable DROP FOREIGN KEY mytable_ibfk_1;
    ALTER TABLE mytable DROP FOREIGN KEY mytable_ibfk_2;
    ALTER TABLE mytable DROP FOREIGN KEY mytable_ibfk_3;

在我的情况下,我删除了外键,但仍然不能删除索引。这是因为在相同的字段中,还有另一个表具有到这个表的外键。在我删除另一个表上的外键之后,我可以删除这个表上的索引。

步骤1

列表外键(注意它不同于索引名)

SHOW CREATE TABLE  <Table Name>

结果将显示外键名称。

格式:

CONSTRAINT `FOREIGN_KEY_NAME` FOREIGN KEY (`FOREIGN_KEY_COLUMN`) REFERENCES `FOREIGN_KEY_TABLE` (`id`),

步骤2

Drop (Foreign/primary/key)键

ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign key name>

步骤3

删除索引。