2011-07-23 69 views
7

Tengo algunos problemas al utilizar claves externas en mi base de datos usando tablas InnoDB. Estoy utilizando MySQL Workbench para diseñar mis modelos de ER y tengo un servidor Zend (OS X) para el desarrollo con MySQL 5.1.54. Todo funciona bien sin ningún error.ERROR: Error 1280: nombre de índice incorrecto

Al implementar esta base de datos en mi servidor en vivo, falla. Es una instalación de Debian con MySQL 5.1.58-1 ~ dotdeb.1-log. No puedo entender por qué estos dos sistemas funcionan de manera diferente.

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

ya ha definido que el índice en el CREATE TABLE' cuando intenta crear de nuevo con la declaración CREATE INDEX' ... –

+0

Sólo un * advertencia *, no un * error *. Solo ignóralo y pasa a hacer algo útil. – Bohemian

+0

posible duplicado de [por qué Mysql me está dando el error 1280 "Índice incorrecto"] (http://stackoverflow.com/questions/6389010/why-mysql-is-giving-me-error-1280-wrong-index) –

Respuesta

8

sé que el tema es un poco viejo, pero tenía este mismo problema hoy en día y ha encontrado una solución rápida y sucia, así que pensé que sería bueno tenerlo aquí para referencia futura.


Solución:

En MySQL Workbench, cuando estás ingeniería directa (CTRL +G), en el primer cuadro de diálogo que aparece (defina las opciones de base de datos a Creado), simplemente desmarque la casilla etiquetada Generate Separate CREATE INDEX Statement.

+0

Confirmado en la última versión para OS X. ¿Alguna razón por la que esto debería suceder sin utilizar MySQL Workbench? – AeroCross

2

En "Reenviar ingeniero a base de datos" Desmarque la casilla de verificación "Generar separa las instrucciones CREATE INDEX". Al marcar esta opción, se crearán los índices dos veces, tanto en Crear tabla como después de Crear tabla.

0

Encontré un caso similar. Como la clave ya está creada, debe soltarla y volver a agregarla. Por ejemplo en mi caso, este es el SQL:

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