Ver Mensaje Individual
  #4 (permalink)  
Antiguo 27/05/2014, 07:13
Avatar de gnzsoloyo
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: ERROR: Error 1005: Can't create table

Hay errores a varios niveles, y se vuelve un poco complicado darte una solución sin instarte a corregir primero los defectos de diseño que tienes...

Por lo pronto, francamente resulta incoveniente usar campos TEXT para datos tan básicos como nombres, apellidos, localidades, denominaciones de servicios, etc. Es excesivo e innecesario.
No es convneinte usar DECIMAL para datos enteros, para eso uya existen los INT, que en este caso usará menos espacio en el disco que un DECIMAL.

Código MySQL:
Ver original
  1. -- Table `DB`.`CLIENTES`
  2. -- -----------------------------------------------------
  3. CREATE TABLE IF NOT EXISTS `DB`.`CLIENTES` (
  4. `COD_CLIENTE_IMPUTACION` DECIMAL(10,0) NOT NULL ,
  5. `NOM` TEXT NULL ,
  6. `USUARIOS_CECO_PR` DECIMAL(10,0) NULL ,
  7. `USUARIOS_CECO_FI` DECIMAL(10,0) NULL ,
  8. `COD_CLIENTE_P_TRABAJO` DECIMAL(10,0) NOT NULL ,
  9. PRIMARY KEY (`COD_CLIENTE_IMPUTACION`, `COD_CLIENTE_P_TRABAJO`) )
  10. DEFAULT CHARACTER SET = utf8;
En este caso estás definicendo una clave compuesta, lo que es terriblemente inseguro, ya que la hará que los campos cod_cliente_imputacion y cod_cliente_p_trabajo puedan repetirse entre diferentes registros sin romper la unicidad de la clave.
No se ve la necesidad de hacer una clave compuesta en ese caso, y no queda claro por qué una aplicación no puede usar la misma clave preexistente en la tabla.
Si pudieras explicarnos esto último, tal vez podamos orientarte mejor.


Código MySQL:
Ver original
  1. -- Table `DB`.`SUBSERVICIOS_P_TRABAJO`
  2. -- -----------------------------------------------------
  3. CREATE TABLE IF NOT EXISTS `DB`.`SUBSERVICIOS_P_TRABAJO` (
  4. `COD_GRUPO` VARCHAR(45) NULL ,
  5. `GRUPO` TEXT NULL ,
  6. `COD_SERVICIO` VARCHAR(45) NULL ,
  7. `SERVICIO` TEXT NULL ,
  8. `COD_SUBSERVICIO` VARCHAR(45) NOT NULL ,
  9. `SUBSERVICIO` TEXT NULL ,
  10. PRIMARY KEY (`COD_SUBSERVICIO`) )

Mismo conjunto de errores: Campos TEXT donde deberían ser VARCHAR. Creo que necesitas estudiar un poco mejor los requerimientosde almacenamiento antes de diseñar las tablas. No pones un tipo TEXT a menos que sea total y absolutamente necesario, entre otras cosas porque no son sencillos ni eficientes de indexar.

Código MySQL:
Ver original
  1. -- Table `TITHINK_DB_CASA_2`.`CONSUMO_APPLE`
  2. -- -----------------------------------------------------
  3. CREATE TABLE IF NOT EXISTS `DB`.`CONSUMO_APPLE` (
  4. `Nombre_Filial` TEXT NULL ,
  5. `AÑO_MES` VARCHAR(45) NULL ,
  6. `Identificador_Filial` VARCHAR(45) NULL ,
  7. `Codigo_Filial` DECIMAL(10,0) NULL ,
  8. `Matricula` VARCHAR(45) NULL ,
  9. `Nombre` TEXT NULL ,
  10. `IMEI` VARCHAR(45) NULL ,
  11. `Marca` TEXT NULL ,
  12. `Modelo` VARCHAR(45) NULL ,
  13. `Serial nº` VARCHAR(45) NULL ,
  14. `Fecha_Alta` DATE NULL ,
  15. `Fecha_Baja` DATE NULL ,
  16. `Precio` FLOAT NULL ,
  17. `COD_SUBSERVICIO` VARCHAR(45) NULL ,
  18. INDEX `FK_CONSUMO_APPLE_CLIENTES_idx` (`Codigo_Filial` ASC) ,
  19. INDEX `FK_CONSUMO_APPLE_SUBSERVICIOS_PT_idx` (`COD_SUBSERVICIO` ASC) ,
  20. CONSTRAINT `FK_CONSUMO_APPLE_CLIENTES`
  21. FOREIGN KEY (`Codigo_Filial` )
  22. REFERENCES `DB`.`CLIENTES` (`COD_CLIENTE_P_TRABAJO` )
  23. CONSTRAINT `FK_CONSUMO_APPLE_SUBSERVICIOS_PT`
  24. FOREIGN KEY (`COD_SUBSERVICIO` )
  25. REFERENCES `DB`.`SUBSERVICIOS_P_TRABAJO` (`COD_SUBSERVICIO` )
El mismo tipo de errores con dos sumados: No se deben usar caracteres extendidos (ñ, á, ç, por ejemplo) en los nombres de las tablas.
Generan serios problemas en la programación, y muchísimos errores de sintaxis no detectables. Usa el alfabeto básico.
Y tampoco se deben usar espacios vacíos, ni caracters o palabras reservadas.
El segundo error es más grave:
Código MySQL:
Ver original
  1. CONSTRAINT `FK_CONSUMO_APPLE_CLIENTES`
  2. FOREIGN KEY (`Codigo_Filial` )
  3. REFERENCES `DB`.`CLIENTES` (`COD_CLIENTE_P_TRABAJO` )
Esto está mal escrito.
Estás intentando crear una FK referenciando un único campo, hacia una tabla cuya PK es compuesta. Una FK debe apuntar a toda la clave, no a parte de ella.
Por consecuencia, si vas a mantener la PK compuesta, deberás poner los mismos campos, del mismo tipo y en el mismo orden de la PK, en la FK.

¿Se va entendiendo?

Por cierto: Un IMEI no tiene 45 dígitos. Los móviles tienen 15, y los simcard tienen 20. Tienes que ajustar el campo al tamaño exacto que tendrá, para evitar que entren datos basura qu epasen por error (si, se cometen errores, hasta las empresas internacionales meten la pata)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)