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

ERROR: Error 1005: Can't create table

Estas en el tema de ERROR: Error 1005: Can't create table en el foro de Mysql en Foros del Web. Buenas, tengo un problemilla al crear una tabla en la base de datos tengo 3 tablas( es donde aparece el problema, hay bastantes mas) -- ...
  #1 (permalink)  
Antiguo 27/05/2014, 02:13
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años
Puntos: 0
ERROR: Error 1005: Can't create table

Buenas, tengo un problemilla al crear una tabla en la base de datos

tengo 3 tablas( es donde aparece el problema, hay bastantes mas)



-- Table `DB`.`CLIENTES`

-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS `DB`.`CLIENTES` (

`COD_CLIENTE_IMPUTACION` DECIMAL(10,0) NOT NULL ,

`NOM` TEXT NULL ,

`USUARIOS_CECO_PR` DECIMAL(10,0) NULL ,

`USUARIOS_CECO_FI` DECIMAL(10,0) NULL ,

`COD_CLIENTE_P_TRABAJO` DECIMAL(10,0) NOT NULL ,

PRIMARY KEY (`COD_CLIENTE_IMPUTACION`, `COD_CLIENTE_P_TRABAJO`) )

ENGINE = InnoDB

DEFAULT CHARACTER SET = utf8;



-- Table `DB`.`SUBSERVICIOS_P_TRABAJO`

-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS `DB`.`SUBSERVICIOS_P_TRABAJO` (

`COD_GRUPO` VARCHAR(45) NULL ,

`GRUPO` TEXT NULL ,

`COD_SERVICIO` VARCHAR(45) NULL ,

`SERVICIO` TEXT NULL ,

`COD_SUBSERVICIO` VARCHAR(45) NOT NULL ,

`SUBSERVICIO` TEXT NULL ,

PRIMARY KEY (`COD_SUBSERVICIO`) )

ENGINE = InnoDB;



-- Table `TITHINK_DB_CASA_2`.`CONSUMO_APPLE`

-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS `DB`.`CONSUMO_APPLE` (

`Nombre_Filial` TEXT NULL ,

`AÑO_MES` VARCHAR(45) NULL ,

`Identificador_Filial` VARCHAR(45) NULL ,

`Codigo_Filial` DECIMAL(10,0) NULL ,

`Matricula` VARCHAR(45) NULL ,

`Nombre` TEXT NULL ,

`IMEI` VARCHAR(45) NULL ,

`Marca` TEXT NULL ,

`Modelo` VARCHAR(45) NULL ,

`Serial nº` VARCHAR(45) NULL ,

`Fecha_Alta` DATE NULL ,

`Fecha_Baja` DATE NULL ,

`Precio` FLOAT NULL ,

`COD_SUBSERVICIO` VARCHAR(45) NULL ,

INDEX `FK_CONSUMO_APPLE_CLIENTES_idx` (`Codigo_Filial` ASC) ,

INDEX `FK_CONSUMO_APPLE_SUBSERVICIOS_PT_idx` (`COD_SUBSERVICIO` ASC) ,

CONSTRAINT `FK_CONSUMO_APPLE_CLIENTES`

FOREIGN KEY (`Codigo_Filial` )

REFERENCES `DB`.`CLIENTES` (`COD_CLIENTE_P_TRABAJO` )

ON DELETE CASCADE

ON UPDATE CASCADE,

CONSTRAINT `FK_CONSUMO_APPLE_SUBSERVICIOS_PT`

FOREIGN KEY (`COD_SUBSERVICIO` )

REFERENCES `DB`.`SUBSERVICIOS_P_TRABAJO` (`COD_SUBSERVICIO` )

ON DELETE NO ACTION

ON UPDATE NO ACTION)

ENGINE = InnoDB;




El error me lo da al crear la tabla consumo, he ido probando poco a poco, primero sin FK, despues añadiendo la del subservicio, hasta aqui todo bien, el problema viene cuando agrago la FK de cliente, me da error

Executing SQL script in server

ERROR: Error 1005: Can't create table '.\DB\consumo_apple.frm' (errno: 150)


Por mas vueltas que le doy, no se a que se debe el error, estoy usando workbech para crear la base de datos.

¿Alguien me echa una mano porfavor?

Saludos y gracias!
  #2 (permalink)  
Antiguo 27/05/2014, 03:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: ERROR: Error 1005: Can't create table

`COD_CLIENTE_P_TRABAJO` no es único en clientes!!!

Yo definiria una PK simple en clientes (idCliente INT(11) autoinc) y un indice unico sobre `COD_CLIENTE_IMPUTACION`, `COD_CLIENTE_P_TRABAJO`.

La FK des de otras tablas la haria contra la PK simple.

(Porque defines los identificadores como DECIMAL(10,0), INT(10) es más simple y permite lo mismo.)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 29/05/2014 a las 01:40
  #3 (permalink)  
Antiguo 27/05/2014, 05:06
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años
Puntos: 0
Respuesta: ERROR: Error 1005: Can't create table

Cita:
Iniciado por quimfv Ver Mensaje
``COD_CLIENTE_P_TRABAJO`` no es único en clientes!!!

Yo definiria una PK simple en clientes (idCliente INT(11) autoinc) y un indice unico sobre `COD_CLIENTE_IMPUTACION`, `COD_CLIENTE_P_TRABAJO`.

La FK des de otras tablas la haria contra la PK simple.

(Porque defines los identificadores como DECIMAL(10,0), INT(10) es más simple i permite lo mismo.)

Como que `COD_CLIENTE_P_TRABAJO` no es unico? es una clave primaria, tiene que ser unico!!. No te he entendido muy bien :(

A ver detallo el problema.

La tabla clientes antes no tenia el `COD_CLIENTE_P_TRABAJO` es algo que le he tenido que añadir para otra aplicacion, que usara unicamente ese codigo ( pero tengo que tener una correspondencia entre los dos codigos por si lo necesito en un futuro)

Una vez añadido ese nuevo codigo en la tabla, he creado la tabla consumo_apple que unicamente aceptara codigos de clientes que esten definidos en la tabla clientes, concretamente los `COD_CLIENTE_P_TRABAJO`.

Lo que no entiendo es porque me da ese error en la fk al relacionar el campo codigo_filial de la tabla consumo_apple con el `COD_CLIENTE_P_TRABAJO` de la tabla clientes. El error esta ahi, pero no se cual es :(


Ya por probar he hecho la KF con la otra primary key de la tabla clientes COD_CLIENTE_IMPUTACION y si me deja!!! arggggg que le pasa a mi COD_CLIENTE_P_TRABAJO?? si lo defino igual que COD_CLIENTE_IMPUTACION!!!

Última edición por lolo435; 27/05/2014 a las 07:05
  #4 (permalink)  
Antiguo 27/05/2014, 07:13
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, 4 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)
  #5 (permalink)  
Antiguo 28/05/2014, 06:37
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años
Puntos: 0
Respuesta: ERROR: Error 1005: Can't create table

Lo de dos claves en la misma tabla se debe a que los codigos de clientes son distintos para las dos aplicaciones y necesito tener almacenados los dos codigos en la base de datos. He hecho una tabla nueva con los clientes de la segunda aplicacion y he creado una tabla que une estas dos tablas de clientes( con dos fk), esque necesito tener una relacion entre los dos codigos de clientes.
  #6 (permalink)  
Antiguo 28/05/2014, 07:18
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, 4 meses
Puntos: 2658
Respuesta: ERROR: Error 1005: Can't create table

No estás entendiendo...
Primero, no digo que no puedas tenerlos. Digo que no es necesario declarar a ambos como PK, porque eso puede llevar a admitir inserciones erróneas.
Supongamos que tienes dos clientes ClienteA y Cliente B, tal que el ClienteA tenga los codigos 1 y 3, y el ClienteB los codigos 10 y 14.
En tu tabla, tal y como lo has planteado, este conjunto de claves sería válido:
Cita:
(1, 3)
(1, 14)
(10, 3)
(10, 14)
Desde el punto de vista de las restricciones de PK, esos cuatro parers de claves son válidos, pero son datos erróneos desde el punto de vista funcional.
Para evitar que se introduzcan datos así deberías controlarlo en la aplicación, ya que la base no podrá.
¿Se entiende ahora?

Ahora bien, lo que estás planteando es el uso de lo que se denomina clave alternativa, o clave candidata, y eso no se hace de esa forma. Se hace declarando el segundo campo, la clave secundaria, como UNIQUE.
Así de simple.

De todos modos, ni siquiera necesitas ese campo allí para implementar esto que dices:
Cita:
los codigos de clientes son distintos para las dos aplicacione
Bastaría con una tabla adicional que relacione la PK de la tabla de clientes con un código alternativo único. No es raro y es sencillo de implementar, y no te traerá complicaciones con el resto de la base. Simplemente usas esa tabla para obtener el código correcpondiente a la aplicación secundaria.

¿Se comprende la idea?

Incluso más: MySQL admite que un campo UNIQUE ser use como FK en otra tabla, por lo que si quiesieras usar el código secundario en alguna restricción, no tendrías problemas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 29/05/2014, 01:47
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: ERROR: Error 1005: Can't create table

Cita:
PRIMARY KEY (`COD_CLIENTE_IMPUTACION`, `COD_CLIENTE_P_TRABAJO`) )
Cita:
Como que `COD_CLIENTE_P_TRABAJO` no es unico? es una clave primaria, tiene que ser unico!!. No te he entendido muy bien :(
Cita:
En tu tabla, tal y como lo has planteado, este conjunto de claves sería válido:
Cita:
(1, 3)
(1, 14)
(10, 3)
(10, 14)
No es único.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: create, null, sql, tabla, table, usuarios
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 08:58.