Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Error 1005, problemas creando una tabla. (https://www.clubdelphi.com/foros/showthread.php?t=54264)

D-MO 12-03-2008 21:34:57

Error 1005, problemas creando una tabla.
 
Que tal, después de algun tiempo ausente en el foro me veo en la necesidad de pedirles un poco de ayuda a resolver este problema.

Me he diseñado la Base de Datos utilizando MySQL Workbench (muy bueno por cierto, lo recomiendo) ya la tenía funcionando pero decidí "optimizarla" de manera tal que podría ahorrarme algunos campos y hacer mas "pequeñas" las consultas, pero, ahora que ya la tengo lista de nuevo cuando intento crear las tablas me da algunos errores (la mayoría los he solucionado) pero con este si me quedé trabado:

Código:

  #1005 - Can't create table './xxx/vehiculo.frm' (errno: 150)

La tabla en cuestión es la siguiente:

Código SQL [-]
-- -----------------------------------------------------
-- Table `xxx`.`vehiculo`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `xxx`.`vehiculo` (
  `CodVehiculo` INT NOT NULL,
  `CodLineaVehiculo` INT NOT NULL ,
  `CodDano` VARCHAR(2) NOT NULL ,
  `CodTitulo` VARCHAR(2) NOT NULL ,
  `LocalidadSubasta` VARCHAR(3) NOT NULL ,
  `FechaSubasta` VARCHAR(8) NOT NULL ,
  `Odometro` INT NULL ,
  `PrecioVenta` FLOAT(7,2) NULL ,
  `Modelo` INT NOT NULL ,
  `Activo` BOOLEAN NOT NULL DEFAULT false ,
  INDEX fk_vehiculo_linea_vehiculo (`CodLineaVehiculo` ASC) ,
  PRIMARY KEY (`CodVehiculo`) ,
  INDEX fk_vehiculo_dano (`CodDano` ASC) ,
  INDEX fk_vehiculo_titulo (`CodTitulo` ASC) ,
  INDEX fk_vehiculo_subasta (`FechaSubasta` ASC, `LocalidadSubasta` ASC) ,
  CONSTRAINT `fk_vehiculo_linea_vehiculo`
    FOREIGN KEY (`CodLineaVehiculo` )
    REFERENCES `xxx`.`linea_vehiculo` (`CodLineaVehiculo` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_vehiculo_dano`
    FOREIGN KEY (`CodDano` )
    REFERENCES `xxx`.`dano` (`CodDano` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_vehiculo_titulo`
    FOREIGN KEY (`CodTitulo` )
    REFERENCES `xxx`.`titulo` (`CodTitulo` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_vehiculo_subasta`
    FOREIGN KEY (`FechaSubasta` , `LocalidadSubasta` )
    REFERENCES `xxxn`.`subasta` (`Fecha` , `CodLocalidad` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Los cambios que se hicieron en esta tabla fueron cambiar el tipo de dato de los campos 'CodDano' y 'CodTitulo' de INT a VARCHAR(2). El cambio tambien se realizó en las tablas respectivas ('dano' y 'titulo'), siendo la estructura de estas la siguiente:

Código SQL [-]
-- -----------------------------------------------------
-- Table `xxx`.`dano`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `xxx`.`dano` (
  `CodDano` VARCHAR(2) NOT NULL,
  `Dano` VARCHAR(20) NOT NULL ,
  `DescripcionDano` VARCHAR(255) NOT NULL ,
  PRIMARY KEY (`CodDano`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `xxx`.`titulo`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `xxx`.`titulo` (
  `CodTitulo` VARCHAR(2) NOT NULL,
  `NombreTitulo` VARCHAR(45) NULL ,
  `DescripcionTitulo` VARCHAR(255) NULL ,
  PRIMARY KEY (`CodTitulo`) )
ENGINE = InnoDB;


Ya di vueltas por todos lados y no he podido solucionar.

La ayuda de MySQL dice lo siguiente:
Cita:

Empezado por Ayuda de MySQL
1005 (ER_CANT_CREATE_TABLE)
No se puede crear la tabla. Si el mensaje del error hace referencia al errno 150, la creación de la tabla falló debido a una restricción de clave foránea incorrectamente formulada.

[enlace]

Pero, ¿cual de las llaves foráneas está mal?

¿Alguien sabe que tengo mal?

Saludos

D-MO 13-03-2008 18:58:28

Bueno, después de probar una cosa tras otra he identificado que la llave foránea que está mal es esta:

Código SQL [-]
         CONSTRAINT  `fk_vehiculo_subasta`  FOREIGN  KEY (  `FechaSubasta` ,  `LocalidadSubasta`  )  REFERENCES  `xxx`.`subasta` ( `FechaSubasta` ,
 `CodLocalidad` 
) ON  DELETE NO ACTION  ON  UPDATE NO ACTION

Creé la tabla sin llaves foráneas y luego fui agregando una por una hasta que esta me dio el mismo error que antes, ahora, ¿Que es lo que está mal?, ¿Alguien sabe?

Edito:
Se me había olvidado colocar la estructura de la tabla 'subasta', esta es la siguiente:

Código SQL [-]
CREATE  TABLE IF NOT EXISTS `xxx`.`subasta` (
  `CodLocalidad` VARCHAR(3) NOT NULL ,
  `FechaSubasta` VARCHAR(8) NOT NULL ,
  `Activa` BOOLEAN NULL DEFAULT false,
  INDEX fk_subasta_localidad_subasta (`CodLocalidad` ASC) ,
  PRIMARY KEY (`CodLocalidad`, `FechaSubasta`) ,
  CONSTRAINT `fk_subasta_localidad_subasta`
    FOREIGN KEY (`CodLocalidad` )
    REFERENCES `xxx`.`localidad_subasta` (`CodLocalidad` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Saludos

keyboy 13-03-2008 19:22:27

No sé si tenga algo que ver o no, pero, ¿no afecta el orden en que listas los campos en la definición de la llave foránea? No me suena muy lógico pero como el índice en la tabla referenciada está en el orden inverso...

Bye

pd: ¡Felicidades!

D-MO 13-03-2008 20:45:24

Cita:

Empezado por keyboy (Mensaje 273051)
No sé si tenga algo que ver o no, pero, ¿no afecta el orden en que listas los campos en la definición de la llave foránea? No me suena muy lógico pero como el índice en la tabla referenciada está en el orden inverso...

Pues en efecto, el error residía en el orden, aquí otro ejemplo de que las cosas mas sencillas nos provocan unos grandes dolores de cabeza :D.

Muchas gracias Keyboy por haberlo notado.
Cita:

Empezado por keyboy (Mensaje 273051)

pd: ¡Felicidades!

Gracias ;):)

Saludos


La franja horaria es GMT +2. Ahora son las 02:40:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi