2011-07-23 75 views
7

我在使用InnoDB表的数据库中使用外键时遇到了一些问题。我正在使用MySQL Workbench来设计我的ER模型,并且有一个用于MySQL 5.1.54开发的Zend Server(OS X)。一切正常,没有任何错误。错误:错误1280:错误的索引名称

将此数据库部署到我的实时服务器时失败。这是一个安装了MySQL 5.1.58-1〜dotdeb.1-log的Debian安装程序。我不明白为什么这两个系统工作如此不同。

ERROR: Error 1280: Incorrect index name '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; 
+2

你已经决定了指数在'CREATE TABLE'当您尝试使用'CREATE语句INDEX'再次创造它... –

+0

这只是一个*警告*,而不是*错误*。只要忽略它并继续做一些有用的事情。 – Bohemian

+0

可能的重复[为什么Mysql给我错误1280“错误索引”](http://stackoverflow.com/questions/6389010/why-mysql-is-giving-me-error-1280-wrong-index) –

回答

8

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


解决方案:

在MySQL工作台,当你正向工程(CTRL +),在显示了第一个对话框(的数据库中设置选项创建),只需取消勾选标记为Generate Separate CREATE INDEX Statement的框。

+0

在OS X的最新版本上确认。为什么会发生这种情况的原因_without_使用MySQL Workbench? – AeroCross

2

在“Forward Engineer To Database”上取消选中“Generate Seperate CREATE INDEX语句”复选框。选中此选项将在创建表和创建表后创建两次索引。

0

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

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