在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, Simplified(简体中文)

Tags:

添加新评论