2011-07-23 30 views
7

InnoDBテーブルを使用してデータベースに外部キーを使用する際に問題が発生しました。私はERモデルを設計するためにMySQL Workbenchを使用しており、MySQL 5.1.54で開発するためのZend Server(OS X)を持っています。すべてエラーなしで正常に動作します。エラー:エラー1280:インデックス名が正しくありません

このデータベースをライブサーバーに展開すると失敗します。これは、MySQL 5.1.58-1〜dotdeb.1-logを持つDebianインストールです。私はこれら2つのシステムがなぜ違うのか理解できません。

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 INDEX'文で再びそれを作成しようとすると、それだけです... –

+0

をTABLE'のCREATE *インデックス警告*、*エラーではありません。それを無視して何か役に立つものに移りなさい。 – Bohemian

+0

[Mysqlが私にエラー1280 "間違ったインデックス"を与えている理由(http://stackoverflow.com/questions/6389010/why-mysql-is-giving-me-error-1280-wrong-index) –

答えて

8

私は、トピックは今少し古いですけど、私は今日、この同じ問題を抱えていたし、迅速かつ汚い解決策を見つけたので、私は今後の参考のためにここでそれを持っていいだろうと思いました。


ソリューション:MySQLのワークベンチで

、あなたが前進するデータベースのための(オプションの設定を示して最初のダイアログで、(GCTRL + )をエンジニアリングしています作成)、単にGenerate Separate CREATE INDEX Statementというラベルのチェックボックスをオフにします。

+0

OS Xの最新バージョンで確認されています。これはMySQL Workbenchを使用せずに行われる理由は何ですか? – AeroCross

2

"Forward Engineer To Database"で、 "Generate Separate CREATE INDEX statements"チェックボックスをオフにします。このオプションをオンにすると、テーブルの作成とテーブルの作成の両方でインデックスが2回スクリプト化されます。

0

同様の場合があります。キーはすでに作成されているため、削除してからもう一度追加する必要があります。私の場合のために例えば、これはSQLです:

ALTER TABLE `focuschamps`.`commit_later` DROP INDEX `cid` , ADD UNIQUE `cid` ( `cid`) 
関連する問題