Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Problema al crear la tabla. Can't create table. (Errno:121)

Estas en el tema de Problema al crear la tabla. Can't create table. (Errno:121) en el foro de Mysql en Foros del Web. Tengo que hacer una prática para la universidad. Desde la consola tengo que cargar un fichero para que cree toda la base de datos. El ...
  #1 (permalink)  
Antiguo 10/03/2011, 04:01
 
Fecha de Ingreso: febrero-2011
Mensajes: 7
Antigüedad: 13 años, 2 meses
Puntos: 0
Problema al crear la tabla. Can't create table. (Errno:121)

Tengo que hacer una prática para la universidad. Desde la consola tengo que cargar un fichero para que cree toda la base de datos. El problema es que en una de las tablas me sale el error del titulo:
Código:
ERROR 1005 (HY000): Can't create table 'practica1.domicilio' (errno: 121)
-------------------------------------------------------------------------
| Level | Code | Message                                                |
-------------------------------------------------------------------------
| Error | 1005 | Can't create table 'practica1.domicilio' (errno: 121)  |
-------------------------------------------------------------------------

Y el fichero sql que intento cargar es este:
Código MySQL:
Ver original
  1. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  2. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  3. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
  4.  
  5. DROP SCHEMA IF EXISTS `practica1` ;
  6. CREATE SCHEMA IF NOT EXISTS `practica1` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
  7. USE `practica1` ;
  8.  
  9. -- -----------------------------------------------------
  10. -- Table `practica1`.`Empleados`
  11. -- -----------------------------------------------------
  12. DROP TABLE IF EXISTS `practica1`.`Empleados` ;
  13.  
  14. CREATE  TABLE IF NOT EXISTS `practica1`.`Empleados` (
  15.   `dni` VARCHAR(9) NOT NULL ,
  16.   `nombre` VARCHAR(50) NULL ,
  17.   `sueldo` INT NOT NULL DEFAULT 0 ,
  18.   PRIMARY KEY (`dni`) )
  19.  
  20.  
  21. -- -----------------------------------------------------
  22. -- Table `practica1`.`telefono`
  23. -- -----------------------------------------------------
  24. DROP TABLE IF EXISTS `practica1`.`telefono` ;
  25.  
  26. CREATE  TABLE IF NOT EXISTS `practica1`.`telefono` (
  27.   `dni_telf` VARCHAR(9) NOT NULL ,
  28.   `telefono` VARCHAR(9) NOT NULL ,
  29.   INDEX `dni` (`dni_telf` ASC) ,
  30.   PRIMARY KEY (`dni_telf`, `telefono`) ,
  31.   CONSTRAINT `dni`
  32.     FOREIGN KEY (`dni_telf` )
  33.     REFERENCES `practica1`.`Empleados` (`dni` )
  34.  
  35.  
  36. -- -----------------------------------------------------
  37. -- Table `practica1`.`codigopostal`
  38. -- -----------------------------------------------------
  39. DROP TABLE IF EXISTS `practica1`.`codigopostal` ;
  40.  
  41. CREATE  TABLE IF NOT EXISTS `practica1`.`codigopostal` (
  42.   `cp` INT NOT NULL ,
  43.   `poblacion` VARCHAR(50) NULL ,
  44.   `provincia` VARCHAR(50) NULL ,
  45.   PRIMARY KEY (`cp`) )
  46.  
  47.  
  48. -- -----------------------------------------------------
  49. -- Table `practica1`.`domicilio`
  50. -- -----------------------------------------------------
  51. DROP TABLE IF EXISTS `practica1`.`domicilio` ;
  52.  
  53. CREATE  TABLE IF NOT EXISTS `practica1`.`domicilio` (
  54.   `calle` VARCHAR(50) NOT NULL ,
  55.   `cp` INT NOT NULL ,
  56.   `dni_dom` VARCHAR(9) NOT NULL ,
  57.   PRIMARY KEY (`calle`, `dni_dom`) ,
  58.   INDEX `cp` (`cp` ASC) ,
  59.   INDEX `dni` (`dni_dom` ASC) ,
  60.   CONSTRAINT `cp`
  61.     FOREIGN KEY (`cp` )
  62.     REFERENCES `practica1`.`codigopostal` (`cp` )
  63.   CONSTRAINT `dni`
  64.     FOREIGN KEY (`dni_dom` )
  65.     REFERENCES `practica1`.`Empleados` (`dni` )
  66.  
  67.  
  68.  
  69. SET SQL_MODE=@OLD_SQL_MODE;
  70. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
  71. SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


Y según tengo entendido, hay dos motores de bases de datos de mysql, InnoDB y MyISAM. InnoDB permite FK y MyISAM da problemas. Al meterme en el phpmyadmin he visto que tengo una cosa rara con los dos y no se si podría ser el problema. Dejo captura de pantalla:

[URL="http://img847.imageshack.us/img847/6871/bdsip1duda.png"]http://img847.imageshack.us/img847/6871/bdsip1duda.png[/URL]

Gracias (=
  #2 (permalink)  
Antiguo 10/03/2011, 05:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema al crear la tabla. Can't create table. (Errno:121)

El problema es relativamente simple:
Estás definiendo dos índices o CONSTRAINT con el mismo nombre y eso no puede existir.
Cuando pones CONSTRAINT nombreConstraint ..., debes tener en cuenta que nombreConstraint debe ser diferente a cualquier otro que exista, sea tabla, índice, FK o lo que sea, y en tu caso estás dandole al INDEX y a la FOREIGN KEY la misma denominación. Por eso chocan.
Mira:
Código MySQL:
Ver original
  1. CREATE  TABLE IF NOT EXISTS `practica1`.`domicilio` (
  2.   `calle` VARCHAR(50) NOT NULL ,
  3.   `cp` INT NOT NULL ,
  4.   `dni_dom` VARCHAR(9) NOT NULL ,
  5.   PRIMARY KEY (`calle`, `dni_dom`) ,
  6.   INDEX `cp` (`cp` ASC) , -- <- Mismo nombre del FK
  7.   INDEX `dni` (`dni_dom` ASC) , -- <- Mismo nombre del FK
  8.   CONSTRAINT `cp` -- <- Mismo nombre del INDEX
  9.     FOREIGN KEY (`cp` )
  10.     REFERENCES `practica1`.`codigopostal` (`cp` )
  11.   CONSTRAINT `dni` -- <- Mismo nombre del INDEX
  12.     FOREIGN KEY (`dni_dom` )
  13.     REFERENCES `practica1`.`Empleados` (`dni` )
La denominación de ambos debe ser diferente:
Código MySQL:
Ver original
  1. CREATE  TABLE IF NOT EXISTS `domicilio` (
  2.   `calle` VARCHAR(50) NOT NULL ,
  3.   `cp` INT NOT NULL ,
  4.   `dni_dom` VARCHAR(9) NOT NULL ,
  5.   PRIMARY KEY (`calle`, `dni_dom`),
  6.   INDEX `idx_cp` (`cp` ASC) ,
  7.   INDEX `idx_dni` (`dni_dom` ASC) ,
  8.   CONSTRAINT `FK_cp`
  9.     FOREIGN KEY (`cp` )
  10.     REFERENCES `codigopostal` (`cp` )
  11.   CONSTRAINT `FK_dni`
  12.     FOREIGN KEY (`dni_dom` )
  13.     REFERENCES `Empleados` (`dni` )
Por esa razón, ente otras cosas, es normal que se les ponga un prefijo que ayuda a saber d qué se trata (idx, fk, etc.) y de paso evita conflictos de nombres.
Estas diferencias también se deben cumplir entre tablas, porque cada FK y cada INDEX genera un archivo de índice en la base, por lo que no puede haber dos iguales que pertenezcan a tablas diferentes ni a la misma.

Postdata: Estás poniendo la imagen en un servicio no público. Te exige registarte para verlo.
No es una buena idea...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 10/03/2011, 07:06
 
Fecha de Ingreso: febrero-2011
Mensajes: 7
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Problema al crear la tabla. Can't create table. (Errno:121)

Gracias por tu respuesta. Pero he probado a hacerlo en esa tabla y el resto, y nada. Sigo teniendo el mismo error.

Ahora mismo lo tengo así:
Código MySQL:
Ver original
  1. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  2. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  3. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
  4.  
  5. CREATE SCHEMA IF NOT EXISTS `practica1` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
  6. USE `practica1` ;
  7.  
  8. -- -----------------------------------------------------
  9. -- Table `practica1`.`Empleados`
  10. -- -----------------------------------------------------
  11. DROP TABLE IF EXISTS `practica1`.`Empleados` ;
  12.  
  13. CREATE  TABLE IF NOT EXISTS `practica1`.`Empleados` (
  14.   `dni` VARCHAR(9) NOT NULL ,
  15.   `nombre` VARCHAR(50) NULL ,
  16.   `sueldo` INT NOT NULL DEFAULT 0 ,
  17.   PRIMARY KEY (`dni`) )
  18.  
  19.  
  20. -- -----------------------------------------------------
  21. -- Table `practica1`.`telefono`
  22. -- -----------------------------------------------------
  23. DROP TABLE IF EXISTS `practica1`.`telefono` ;
  24.  
  25. CREATE  TABLE IF NOT EXISTS `practica1`.`telefono` (
  26.   `dni` VARCHAR(9) NOT NULL ,
  27.   `telefono` VARCHAR(9) NOT NULL ,
  28.   INDEX `idx_dni` (`dni` ASC) ,
  29.   PRIMARY KEY (`dni`, `telefono`) ,
  30.   CONSTRAINT `FK_dni`
  31.     FOREIGN KEY (`dni` )
  32.     REFERENCES `practica1`.`Empleados` (`dni` )
  33.  
  34.  
  35. -- -----------------------------------------------------
  36. -- Table `practica1`.`codigopostal`
  37. -- -----------------------------------------------------
  38. DROP TABLE IF EXISTS `practica1`.`codigopostal` ;
  39.  
  40. CREATE  TABLE IF NOT EXISTS `practica1`.`codigopostal` (
  41.   `cp` INT NOT NULL ,
  42.   `poblacion` VARCHAR(50) NULL ,
  43.   `provincia` VARCHAR(50) NULL ,
  44.   PRIMARY KEY (`cp`) )
  45.  
  46.  
  47. -- -----------------------------------------------------
  48. -- Table `practica1`.`domicilio`
  49. -- -----------------------------------------------------
  50. DROP TABLE IF EXISTS `practica1`.`domicilio` ;
  51.  
  52. CREATE  TABLE IF NOT EXISTS `practica1`.`domicilio` (
  53.   `calle` VARCHAR(50) NOT NULL ,
  54.   `cp` INT NOT NULL ,
  55.   `dni` VARCHAR(9) NOT NULL ,
  56.   PRIMARY KEY (`calle`, `dni`) ,
  57.   INDEX `idx_cp` (`cp` ASC) ,
  58.   INDEX `idx_dni` (`dni` ASC) ,
  59.   CONSTRAINT `FK_cp`
  60.     FOREIGN KEY (`cp` )
  61.     REFERENCES `practica1`.`codigopostal` (`cp` )
  62.   CONSTRAINT `FK_dni`
  63.     FOREIGN KEY (`dni` )
  64.     REFERENCES `practica1`.`Empleados` (`dni` )
  65.  
  66.  
  67.  
  68. SET SQL_MODE=@OLD_SQL_MODE;
  69. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
  70. SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

PD: a mi no me pide nada para ver la imagen. Lo unico es que el foro ha cogido [ / URL] como parte del link.

Mira en este:

http://img847.imageshack.us/img847/6871/bdsip1duda.png

  #4 (permalink)  
Antiguo 10/03/2011, 07:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema al crear la tabla. Can't create table. (Errno:121)

Estás poniendo "FK_dni" como nombre de constraint en dos tablas: TELEFONO y DOMICILIO.
Como te dije, no sólo es en la misma tabla, no puede existir el mismo nombre de constraint en diferentes tablas de la misma base...

Revisa y numéralas de ser necesario.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 10/03/2011, 10:27
 
Fecha de Ingreso: febrero-2011
Mensajes: 7
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Problema al crear la tabla. Can't create table. (Errno:121)

Gracias. Ahora todo ok.

Etiquetas: create, table, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:30.