기존 데이터베이스를 변경하여 열을 추가해야합니다. 결과적으로 새 열을 포함하도록 UNIQUE 필드를 업데이트하고 싶습니다. 현재 색인을 제거하려고하지만 오류가 계속 발생합니다.MySQL Cannot drop index needed in a foreign key constraint
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
답변
외래 키를 삭제해야합니다. MySQL의 외래 키는 테이블에 인덱스를 자동으로 생성합니다 ( 주제에 대한 SO 질문 이 있음).
ALTER TABLE mytable DROP FOREIGN KEY mytable_ibfk_1 ;
답변
1 단계
외래 키 나열 (인덱스 이름과 다른 점)
SHOW CREATE TABLE <Table Name>
결과에 외래 키 이름이 표시됩니다.
체재:
CONSTRAINT `FOREIGN_KEY_NAME` FOREIGN KEY (`FOREIGN_KEY_COLUMN`) REFERENCES `FOREIGN_KEY_TABLE` (`id`),
2 단계
드롭 (외국 / 기본 / 키) 키
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign key name>
3 단계
색인을 삭제하십시오.
답변
당신이 이것을 할 수 있다는 것을 의미한다면 :
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);
답변
외래 키 필드에 인덱스가 있어야하므로 ‘AID’필드에 간단한 인덱스를 만들 수 있습니다.
CREATE INDEX aid_index ON mytable (AID);
그런 다음에 만 고유 색인 ‘AID’를 삭제하십시오.
ALTER TABLE mytable DROP INDEX AID;
답변
외래 키에는 항상 인덱스가 필요합니다. 인덱스를 사용하지 않으면 제약 조건을 적용하면 참조 테이블의 모든 삽입 또는 업데이트 된 키에 대해 참조 테이블에서 전체 테이블 스캔이 필요합니다. 이는 용납 할 수없는 성능 영향을 미칩니다. 다음과 같은 두 가지 결과가 있습니다.
- 외래 키를 만들 때 데이터베이스는 인덱스가 있는지 확인합니다. 그렇지 않으면 색인이 작성됩니다. 기본적으로 제약 조건과 이름이 같습니다.
- 외래 키에 사용할 수있는 인덱스가 하나만 있으면 삭제할 수 없습니다. 실제로 삭제하지 않으려면 외래 키 제약 조건을 삭제하거나 다른 인덱스를 먼저 만들어야합니다.
답변
이것이 인덱스를 삭제하는 쉬운 방법이라고 생각합니다.
set FOREIGN_KEY_CHECKS=1;
ALTER TABLE mytable DROP INDEX AID;
set FOREIGN_KEY_CHECKS=0;
답변
필자의 경우 외래 키를 삭제했지만 여전히 인덱스를 삭제할 수 없습니다. 동일한 필드에이 테이블에 대한 외래 키가있는 또 다른 테이블이 있었기 때문입니다. 다른 테이블에서 외래 키를 삭제 한 후이 테이블에서 인덱스를 삭제할 수 있습니다.