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

[SOLUCIONADO] No puedo añadir foreign key

Estas en el tema de No puedo añadir foreign key en el foro de Mysql en Foros del Web. Estoy creando los foreign key de una tabla mediante consultas SQL del PHPMyAdmin. Entonces he conformado la siguiente instrucción @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original ...
  #1 (permalink)  
Antiguo 14/09/2013, 03:46
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
No puedo añadir foreign key

Estoy creando los foreign key de una tabla mediante consultas SQL del PHPMyAdmin.

Entonces he conformado la siguiente instrucción

Código SQL:
Ver original
  1. ALTER TABLE answers
  2. #editado he descubierto que la siguiente linea es un error, pero no se si mi problema se debe a esto
  3. ADD FOREIGN KEY (id_answers) REFERENCES answers (id_answer)
  4. AND
  5. ADD FOREIGN KEY (id_questions) REFERENCES questions (id_question)
  6. AND
  7. ADD FOREIGN KEY (id_users) REFERENCES users (id_user)

Pero me devuelve lo siguiente, no me ha aparecido en mensaje de texto rojo, como otras veces, sino en blanco, pero no me ha creado los enlaces entre tablas.

Cita:
import.php: Parámetro faltante: import_type
import.php: Parámetro faltante: format
¿A qué se refiere con eso?. Ya he utilizado esa instrucción pero con una sola columna, la diferencia es que ahora para todas las columnas lo he hecho todo en una sola instrucción.
__________________
Ayúdame a hacerlo por mi mismo.

Última edición por guardarmicorreo; 14/09/2013 a las 04:37
  #2 (permalink)  
Antiguo 14/09/2013, 06:26
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 con alter table

Cita:
import.php: Parámetro faltante: import_type
import.php: Parámetro faltante: format
Esto no es tema de MySQL, sino PHP. por este detalle, pregunta en el Foro de PHP.

En cuanto al código, AND se usa única y exclusivamente en el WHERE del SELECT.
Consulta el manual de referencia para ver cómo se implementa un ALTER TABLE múltiple:
Código MySQL:
Ver original
  1. ALTER TABLE answers
  2. ADD FOREIGN KEY (id_answers) REFERENCES answers (id_answer),
  3. ADD FOREIGN KEY (id_questions) REFERENCES questions (id_question),
  4. ADD FOREIGN KEY (id_users) REFERENCES users (id_user);

Todos los que nos dedicamos a las bases de datos, inclusive profesionalmente, tenemos siempre el manual de referencia a un click de distancia, porque nadie se acuerda de todo.

Una sugerencia adicional: Instálate el MySQL Workbench, y prueba en él la sintaxis de las consultas. Esa interfaz tiene un corrector sintáctico que te mostrará inmediatamente qué sentencias están mal escritas y dónde.
__________________
¿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 14/09/2013, 10:07
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Problema con alter table

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Esto no es tema de MySQL, sino PHP. por este detalle, pregunta en el Foro de PHP.

En cuanto al código, AND se usa única y exclusivamente en el WHERE del SELECT.
Consulta el manual de referencia para ver cómo se implementa un ALTER TABLE múltiple:
Código MySQL:
Ver original
  1. ALTER TABLE answers
  2. ADD FOREIGN KEY (id_answers) REFERENCES answers (id_answer),
  3. ADD FOREIGN KEY (id_questions) REFERENCES questions (id_question),
  4. ADD FOREIGN KEY (id_users) REFERENCES users (id_user);

Todos los que nos dedicamos a las bases de datos, inclusive profesionalmente, tenemos siempre el manual de referencia a un click de distancia, porque nadie se acuerda de todo.

Una sugerencia adicional: Instálate el MySQL Workbench, y prueba en él la sintaxis de las consultas. Esa interfaz tiene un corrector sintáctico que te mostrará inmediatamente qué sentencias están mal escritas y dónde.
Gracias amigo!
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 16/09/2013, 10:12
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
no puedo añadir foreign key

He creado dos tablas, una de ellas tiene dos campos que apuntan a el id de la otra.

No es para que repitan información. Explico:

Una tabla es users con un id. Cada usuario responderá unas preguntas sobre otro. Tanto el que pregunta como el protagonista de las preguntas quedarán reflejados en la tabla answers.

Pero al querer establecer el segundo foreign key no me deja.

EDITO

Intenté añadir el foreign key con este comando

Código SQL:
Ver original
  1. ALTER TABLE answers
  2. ADD FOREIGN KEY (viewed_users) REFERENCES users (id_user)

Pero el error que me muestra es el siguiente

Cita:
#1005 - Can't create table 'admin_a60680913.#sql-4e7_bda3' (errno: 150)
Los show create table de cada tabla son los siguientes

tabla users

Código SQL:
Ver original
  1. CREATE TABLE `users` (
  2.  `id_user` INT(255) NOT NULL AUTO_INCREMENT,
  3.  `id_twitter` INT(255) NOT NULL COMMENT 'id de la cuenta twitter',
  4.  `nombre` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL COMMENT 'nombre en twitter',
  5.  `imagen` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL COMMENT 'imagen en twitter',
  6.  `oauth_token` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
  7.  `oauth_token_secret` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
  8.  PRIMARY KEY (`id_user`)
  9. ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8

tabla answers

Código SQL:
Ver original
  1. CREATE TABLE `answers` (
  2.  `id_answer` INT(255) NOT NULL AUTO_INCREMENT,
  3.  `answer` VARCHAR(255) COLLATE utf8_spanish2_ci NOT NULL,
  4.  `id_questions` INT(255) NOT NULL,
  5.  `id_users` INT(255) NOT NULL,
  6.  `datetime` datetime NOT NULL,
  7.  `viewed_users` INT(10) UNSIGNED DEFAULT NULL,
  8.  PRIMARY KEY (`id_answer`),
  9.  KEY `id_questions` (`id_questions`),
  10.  KEY `id_users` (`id_users`),
  11.  CONSTRAINT `answers_ibfk_2` FOREIGN KEY (`id_questions`) REFERENCES `questions` (`id_question`),
  12.  CONSTRAINT `answers_ibfk_3` FOREIGN KEY (`id_users`) REFERENCES `users` (`id_user`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci COMMENT='administra las respuestas de cada usuario'

¿Alguien que me ayude a entender lo que sucede y solucionar el problema?
__________________
Ayúdame a hacerlo por mi mismo.
  #5 (permalink)  
Antiguo 16/09/2013, 11:05
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: no puedo añadir foreign key

Hola, antes que nada, estás abriendo dos hilos para básicamente un mismo tema, referido a FK.
Te recuerdo que eso no se permite, y está explicitamente prohibido en las Politicas de Uso de FDW.
Este hilo está relacionado con el otro, donde planteabas problemas con el ALTER TABLE, y serán fusionados en un rato.

Además de este detalle, y yendo al problema que te aqueja, hay un par de cosas que necesitas corregir, una de las cuales puede estar causando tu problema.
Este "255" que pones en las columnas numéricas es total y absolutamente inútil. Para mas información, no representa la cantidad de dígitos ni nada que se le parezca, pero puede causarte problemas luego.
La explicación de para qué el sistema pone ese numero está en el manual de referencia y se ha explicado en este foro varias veces. En realidad, no sirve para nada útil, y no restringe ni expande la longitud del numero, porque los valores numéricos no se almacenan como cifras, sino como números binarios. Y eso es otra cosa. Por eso la longitud máxima de un INT es de 4 bytes, y un bigint de 8, y MySQL no usa mas que eso.
Pero por otro lado, como estás definiendo diferente el campo FK de una tabla, respecto al de la PK referida (10 en uno y 255 en el otro), eso es una causa probable del fallo.
También hay que comprobar que las tablas estén vacías, y si no están vacías, asegurarse que los datos que existan cumplan las restricciones indicadas por la nueva FK.
Si al menos un registro no la cumple, no te dejará crear la FK.
Código MySQL:
Ver original
  1. CREATE TABLE `users` (
  2.  `id_user` int NOT NULL AUTO_INCREMENT,
  3.  `id_twitter` int NOT NULL COMMENT 'id de la cuenta twitter',
  4.  `nombre` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL COMMENT 'nombre en twitter',
  5.  `imagen` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL COMMENT 'imagen en twitter',
  6.  `oauth_token` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
  7.  `oauth_token_secret` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
  8.  PRIMARY KEY (`id_user`)
  9.  
  10. CREATE TABLE `answers` (
  11.  `id_answer` int NOT NULL AUTO_INCREMENT,
  12.  `answer` varchar(255) COLLATE utf8_spanish2_ci NOT NULL,
  13.  `id_questions` int(255) NOT NULL,
  14.  `id_users` int(255) NOT NULL,
  15.  `datetime` datetime NOT NULL,
  16.  `viewed_users` int UNSIGNED DEFAULT NULL,
  17.  PRIMARY KEY (`id_answer`),
  18.  KEY `id_questions` (`id_questions`),
  19.  KEY `id_users` (`id_users`),
  20.  CONSTRAINT `answers_ibfk_2` FOREIGN KEY (`id_questions`) REFERENCES `questions` (`id_question`),
  21.  CONSTRAINT `answers_ibfk_3` FOREIGN KEY (`id_users`) REFERENCES `users` (`id_user`)
  22. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci COMMENT='administra las respuestas de cada usuario';
  23.  
  24. ALTER TABLE answers
  25. ADD FOREIGN KEY (viewed_users) REFERENCES users (id_user);

Otro detalle que debes tener en cuenta es que 255 no es la longitud máxima actualmente en un VARCHAR. Una columna de ese tipo puede tener 65536 caracteres de longitud.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 16/09/2013, 12:12
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: No puedo añadir foreign key

Fusionado en cumplimiento de la Política de Uso 2.4.
__________________
¿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 16/09/2013, 13:51
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: No puedo añadir foreign key

Muchas gracias por tu atención. Pido disculpas por haber abierto dos temas iguales. En un principio no los creía iguales, pero si se tratan de FK entonces sí, tienes razón.

Respecto al apunte que me haces, tienes razón, el 255 no sirve de nada. Es la costumbre con los VARCHAR, me enseñaron que había que limitarlos a 255 y ahí se quedó la manía. Lo corregiré para futuros desarrollos.

Respecto al problema que tengo también tienes razón. He cambiado todos los 255 de todos los campos INT de todas las tablas por 11, he ejecutado la instrucción SQL y ha funcionado, me ha creado el FK y relacionado con el id_user de users.

Es grato aprender contigo. Muchas gracias!!!! :D

(Siento de nuevo el haber repetido temas, en absoluto era mi intención)
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 16/09/2013, 14: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: No puedo añadir foreign key



Me alegro que te sirviera.

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

Etiquetas: campo, key, php, sql, tabla, table
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 01:43.