错误:错误1280:索引名称不正确

时间:2011-07-23 00:50:59

标签: mysql

使用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;

3 个答案:

答案 0 :(得分:8)

我知道这个主题现在有点老了,但我今天也遇到了同样的问题并找到了一个快速而肮脏的解决方案,所以我认为将它放在这里以供将来参考会很好。


<强>解决方案:

在MySQL Workbench上,当您正在进行工程设计( CTRL + G )时,在显示的第一个对话框中(设置数据库选项)创建),只需取消选中标有Generate Separate CREATE INDEX Statement 的框。

答案 1 :(得分:2)

在“正向工程师到数据库”上取消选中“生成单独的CREATE INDEX语句”复选框。选中此选项将在“创建表”和“创建表”之后对索引编写两次脚本。

答案 2 :(得分:0)

遇到了类似的案件。由于密钥已经创建,因此您必须将其删除,然后重新添加。例如,对于我的情况,这是SQL:

ALTER TABLE  `focuschamps`.`commit_later` DROP INDEX  `cid` , ADD UNIQUE  `cid` (  `cid` )