在MySQL裡修改一個本身是外鍵或者擁有外鍵的字段

在MySQL裡,如果一個字段本身是外鍵,或者它擁有一個外鍵, 直接修改之,會引發類似下面的錯誤:

Error
SQL query:
ALTER TABLE `city` CHANGE `CountryCode` `CountryCode` CHAR( 3 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT ''
MySQL said:
#1025 - Error on rename of './test/#sql-82d_2cb' to './test/city' (errno: 150)

用命令
show create table city;
查看,會發現"CountryCode"這個字段("city"表裡)是一個外鍵,它是指向"country"表裡的"Code"字段的:

CREATE TABLE `city` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`CountryCode` char(3) CHARACTER SET latin1 NOT NULL DEFAULT '',
`District` char(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

一個快捷的解決方法是在執行修改字段的命令之前,手動設置foreign_key_checks為0:

SET foreign_key_checks = 0;
ALTER TABLE `city` CHANGE `CountryCode` `CountryCode` CHAR( 3 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '';
SET foreign_key_checks = 1;

所有命令順利執行!

Chinese, Traditional

Tags:

發表新回應