我使用InnoDB表在数据库中使用外键时遇到了一些问题.我正在使用MySQL Workbench来设计我的ER模型,并使用Zend Server(OS X)进行MySQL 5.1.54的开发.一切正常,没有任何错误.
将此数据库部署到我的实时服务器时,它会失败.这是一个使用MySQL 5.1.58-1~dotdeb.1-log的Debian安装.我无法理解为什么这两个系统的工作方式如此不同.
错误:错误1280:索引名称不正确'fk_accounts_countries_idcountry'
DROP TABLE IF EXISTS `countries` ;
SHOW WARNINGS;
CREATE TABLE IF NOT EXISTS `countries` (
`idcountry` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT ,
`name` CHAR(50) NOT NULL ,
`prefix` CHAR(2) NULL DEFAULT NULL ,
`tld` CHAR(4) NULL DEFAULT NULL ,
PRIMARY KEY (`idcountry`) )
ENGINE = InnoDB
AUTO_INCREMENT = 270
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `accounts`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `accounts` ;
SHOW WARNINGS;
CREATE TABLE IF NOT EXISTS `accounts` (
`idaccount` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`countries_idcountry` SMALLINT UNSIGNED NOT NULL ,
`fk_account` INT UNSIGNED NOT NULL ,
`fk_country` INT UNSIGNED NOT NULL ,
`username` CHAR(30) NOT NULL ,
`password` CHAR(32) NOT NULL ,
`mail` CHAR(50) NOT NULL ,
`address` CHAR(50) NULL ,
`city` CHAR(50) NOT NULL ,
`company` CHAR(50) NULL ,
`phone` CHAR(25) NULL ,
`regdate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`ratedate` TIMESTAMP NULL ,
`lastlogin` TIMESTAMP NULL ,
`activated` TINYINT(1) NULL DEFAULT 0 ,
`activation` CHAR(32) NULL ,
PRIMARY KEY (`idaccount`) ,
CONSTRAINT `fk_accounts_countries_idcountry`
FOREIGN KEY (`countries_idcountry` )
REFERENCES `countries` (`idcountry` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SHOW WARNINGS;
CREATE INDEX `fk_accounts_countries_idcountry` ON `accounts` (`countries_idcountry`ASC);
SHOW WARNINGS;
Run Code Online (Sandbox Code Playgroud)
我知道这个话题现在有点老了,但是今天我遇到了同样的问题并找到了一个快速而肮脏的解决方案,所以我认为将它放在这里以供将来参考会很好.
解:
在MySQL Workbench上,当您正在进行工程设计(CTRL+ G)时,在显示的第一个对话框(设置要创建的数据库的选项)中,只需取消选中标记的框Generate Separate CREATE INDEX Statement.