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

[SOLUCIONADO] Error (aparentemente tonto) con clave foranea y tipos de dato

Estas en el tema de Error (aparentemente tonto) con clave foranea y tipos de dato en el foro de Mysql en Foros del Web. Hola a todos, Pido ayuda porque al establecer unas claves foráneas me está dando un error aparentemente evidente pero que por más que reviso no ...
  #1 (permalink)  
Antiguo 30/07/2013, 09:21
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 10 meses
Puntos: 1
Error (aparentemente tonto) con clave foranea y tipos de dato

Hola a todos,

Pido ayuda porque al establecer unas claves foráneas me está dando un error aparentemente evidente pero que por más que reviso no consigo solventar.

La sentencia SQL:
Código SQL:
Ver original
  1. ALTER TABLE `clientes-mails`
  2.     ADD FOREIGN KEY ( `id_cliente_cm` ) REFERENCES `neuro`.`clientes` (`id_cliente`)
  3.     ON DELETE CASCADE ON UPDATE CASCADE ;

El error:
Cita:
Ocurrió un error al crear la clave foránea en id_cliente_cm (revise los tipos de dato)
El campo 'clientes-mails'.'id_cliente_cm' tiene un índice y el campo 'clientes'.'id_cliente' es PK de 'clientes'

He verificado que tanto el campo 'clientes-mails'.'id_cliente_cm' y el campo 'clientes'.'id_cliente' tienen los dos los mismos tipos de datos:

- tipo dato: varchar (10)
- cotejamiento: utf8_general_ci
- motor de ambas tablas: InnoDB

En fin, que no se me ocurre que puede ser lo que esté dando el problema.

Gracias de antemano,

GMG

Última edición por gnzsoloyo; 30/07/2013 a las 09:51
  #2 (permalink)  
Antiguo 30/07/2013, 09:54
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 (aparentemente tonto) con clave foranea y tipos de dato

por las dudas, ejecuta lo siguiente y verifiquemos:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE `clientes-mails`;
  2. SHOW CREATE TABLE `clientes`;

Opia y postea lo que te devuelva cada una.
Otra cosa: nunca, jamás uses caracteres o palabras reservadas en los nombres de objetos de base de datos (columnas, tablas, bases, rutinas). El día que te olvides de poner los acentos graves (`), se generarán errores sintácticos y te preguntarás po r qué.
Es decir, no uses el signo menos (-), usa la raya (_).
__________________
¿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 30/07/2013, 10:22
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Error (aparentemente tonto) con clave foranea y tipos de dato

Hola gnzsoloyo;

Cita:
Iniciado por gnzsoloyo Ver Mensaje
por las dudas, ejecuta lo siguiente y verifiquemos:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE `clientes-mails`;
  2. SHOW CREATE TABLE `clientes`;

Opia y postea lo que te devuelva cada una.
Otra cosa: nunca, jamás uses caracteres o palabras reservadas en los nombres de objetos de base de datos (columnas, tablas, bases, rutinas). El día que te olvides de poner los acentos graves (`), se generarán errores sintácticos y te preguntarás po r qué.
Es decir, no uses el signo menos (-), usa la raya (_).
Marcando textos completos y mostrar columna de relación...

clientes-mails devuelve:
Código SQL:
Ver original
  1. CREATE TABLE `clientes-mails` (  
  2. `id_cm` INT(11) NOT NULL AUTO_INCREMENT,  
  3. `id_mail_cm` INT(11) NOT NULL,  
  4. `id_cliente_cm` VARCHAR(10) NOT NULL,  
  5. `mail_status_cm` tinyint(1) NOT NULL COMMENT '1=ok; 2=error',  
  6. `mail_error_cm` VARCHAR(150) NOT NULL COMMENT 'Error capturado por la clase phpmailer',  
  7. PRIMARY KEY (`id_cm`),  KEY `id_mail_cm` (`id_mail_cm`,`id_cliente_cm`),  
  8. KEY `id_cliente_cm` (`id_cliente_cm`),  CONSTRAINT `clientes-mails_ibfk_1` FOREIGN KEY (`id_mail_cm`)
  9. REFERENCES `mails` (`id_mail`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8

y clientes devuelve:
Código SQL:
Ver original
  1. CREATE TABLE `clientes` (  
  2. `id_cliente` VARCHAR(10) COLLATE utf8_unicode_ci NOT NULL,  
  3. `cif_cliente` VARCHAR(9) COLLATE utf8_unicode_ci NOT NULL,  
  4. `nombre_empresa_cliente` VARCHAR(50) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Nombre de la empresa',  
  5. `nombre_contacto_cliente` VARCHAR(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Nombre de la persona de contacto',  
  6. `mail_cliente` VARCHAR(150) COLLATE utf8_unicode_ci NOT NULL,  
  7. `actividad_cliente` INT(11) NOT NULL COMMENT 'Clave foranea que referencia a la tabla actividades',  
  8. `comercial_asignado_cliente` INT(11) NOT NULL COMMENT 'Clave foranea que referencia a la tabla comerciales',  
  9. `id_usuario_cliente` INT(11) NOT NULL COMMENT 'Clave foranea que referencia a la tabla usuarios',  
  10. PRIMARY KEY (`id_cliente`),  
  11. KEY `actividad_cliente` (`actividad_cliente`),  
  12. KEY `comercial_asignado_cliente` (`comercial_asignado_cliente`),  
  13. KEY `id_usuario_cliente` (`id_usuario_cliente`),  
  14. CONSTRAINT `clientes_ibfk_10` FOREIGN KEY (`id_usuario_cliente`) REFERENCES `usuarios` (`id_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,  
  15. CONSTRAINT `clientes_ibfk_5` FOREIGN KEY (`comercial_asignado_cliente`) REFERENCES `comerciales` (`id_comercial`) ON UPDATE CASCADE,  
  16. CONSTRAINT `clientes_ibfk_7` FOREIGN KEY (`actividad_cliente`) REFERENCES `actividades` (`id_actividad`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Tu dirás ahora que, las BBDD no son lo mío precisamente.

Muchas gracias por la ayuda.

Saludos,

GMG
  #4 (permalink)  
Antiguo 30/07/2013, 10:30
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 (aparentemente tonto) con clave foranea y tipos de dato

Pues el error es bastante evidente.
En Cliente tienes:
Código MySQL:
Ver original
  1. `id_cliente` varchar(10) COLLATE utf8_unicode_ci NOT NULL,

Mientras que en mail-cliente:
Código MySQL:
Ver original
  1. `id_mail_cm` int(11) NOT NULL,
Ni siquiera son del mismo tipo de dato, y por tanto no puedes hacer una FK como la que quieres.
Lo que no entiendo es por qué tienes el id_cliente en la tabla como varchar... ¿Es un nombre o username?

Fuera de eso, da la impresión de que hay algunos errores de diseño de las relaciones, pero habría que analizarlo con más tiempo. En todo caso, el problema es ese.
__________________
¿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 30/07/2013, 11:04
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Error (aparentemente tonto) con clave foranea y tipos de dato

Hola de nuevo gnzsoloyo:

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Pues el error es bastante evidente.
En Cliente tienes:
Código MySQL:
Ver original
  1. `id_cliente` varchar(10) COLLATE utf8_unicode_ci NOT NULL,

Mientras que en mail-cliente:
Código MySQL:
Ver original
  1. `id_mail_cm` int(11) NOT NULL,
Ni siquiera son del mismo tipo de dato, y por tanto no puedes hacer una FK como la que quieres.
Lo que no entiendo es por qué tienes el id_cliente en la tabla como varchar... ¿Es un nombre o username?

Fuera de eso, da la impresión de que hay algunos errores de diseño de las relaciones, pero habría que analizarlo con más tiempo. En todo caso, el problema es ese.
No entiendo que tiene que ver id_cliente con id_mail_cm. Si te fijas id_mail_cm es FK en la tabla clientes-mails y referencia a id_mail en la tabla mails. Esta relación no he tenido ningun impedimento para crearla.

id_cliente_cm es FK en la tabla clientes-mails y pretende referenciar a id_cliente en la tabla clientes... pero es aquí donde me da el error.

Esta es la sentencia SQL:

Código SQL:
Ver original
  1. ALTER TABLE `clientes-mails`
  2.         ADD FOREIGN KEY ( `id_cliente_cm` ) REFERENCES `neuro`.`clientes` (`id_cliente`)
  3.         ON DELETE CASCADE ON UPDATE CASCADE ;

Si no me equivoco en ningún momento intento hacer una relación entre id_cliente e id_mail_cm, ¿no?

Dime algo si puedes porque no lo tengo nada claro.

Gracias,

GMG
  #6 (permalink)  
Antiguo 30/07/2013, 11:11
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 (aparentemente tonto) con clave foranea y tipos de dato

En esa sentencia que pones estás intentando declarar el campo clientes-mail.id_cliente_cm, como FOREIGN KEY de clientes.id_cliente. Es decir que id_cliente_cm apunta a id_cliente.
Entonces, el campo id_cliente_cm debe ser del mismo tipo que id_cliente en su tabla.
¿Eso se entiende?
Si eso no es lo que quieres hacer, ¿qué se supone que quieres definir como FK en esa tabla?

Vamos a empezar por la definición de FK, para que se entienda mejor: Una FK es un campo o conjunto de campos cuyo valor referencia y depende de la PK de otra tabla.
En MySQL pueden apuntar a otra columna o grupo de columnas que no sean PK de la tabla referida si y sólo si:
1) El campo o conjunto de campos en la otra tabla es clave de indice UNIQUE.
2) Cada campo como FK es del mismo tipo, rango y collation (de ser caracter) que el correspondiente en la tabla origen.
3) Si es una clave múltiple, deben estar en el mismo orden.

Eso queda más claro?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 30/07/2013 a las 11:19
  #7 (permalink)  
Antiguo 30/07/2013, 11:33
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Error (aparentemente tonto) con clave foranea y tipos de dato

Hola de nuevas:

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Es decir que id_cliente_cm apunta a id_cliente.
Entonces, el campo id_cliente_cm debe ser del mismo tipo que id_cliente en su tabla.
¿Eso se entiende?
Si eso no es lo que quieres hacer, ¿qué se supone que quieres definir como FK en esa tabla?
Exactamente eso es id_cliente_cm apunta a id_cliente y resulta que id_cliente_cm es varchar(10) e id_cliente es varchar(10). Son exactamente del mismo tipo de dato. No se porque dices que son diferentes tipos.

Por cierto, son un varchar porque he de heredar los códigos de cliente de otro sistema ya existente y es un código alfanumérico, nada más por eso.

¿Donde estás mirando tu el tipo de dato? yo lo veo directamente en PHP MyAdmin, en la estructura de las tablas. Si pudiera te pegaría el recorte de pantalla pero no se hacerlo :(

Sigo sin verlo claro.

Saludos,

GMG
  #8 (permalink)  
Antiguo 30/07/2013, 11:41
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Error (aparentemente tonto) con clave foranea y tipos de dato

Bueno, pues tema cerrado. =))

Resulto ser un problema de cotejamiento. En una tabla tenia utf8_general_ci y en la otra utf8_unicode_ci.

He igualado el charset a utf8_general_ci y listo.

Gracias por toda la ayuda en cualquier caso.

Un saludo,

GMG

Etiquetas: campo, clave, dato, sql, tabla
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:18.