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

[SOLUCIONADO] Error al querer agregar clave foránea con 'alter table'

Estas en el tema de Error al querer agregar clave foránea con 'alter table' en el foro de Mysql en Foros del Web. He creado dos tablas: artículos y líneas. La tabla 'Artículos' tiene el campo 'CodLinea' y la tabla 'Líneas' el campo 'CodSistema' Como creé primero la ...
  #1 (permalink)  
Antiguo 28/07/2015, 09:05
Avatar de socosa  
Fecha de Ingreso: junio-2015
Ubicación: Asunción
Mensajes: 12
Antigüedad: 8 años, 8 meses
Puntos: 0
Error al querer agregar clave foránea con 'alter table'

He creado dos tablas: artículos y líneas.

La tabla 'Artículos' tiene el campo 'CodLinea' y la tabla 'Líneas' el campo 'CodSistema'
Como creé primero la tabla 'Artículos' y luego la tabla 'Lineas', no agregué clave foránea.
He intentado 3 veces hacerlo mediante la sentencia:
Código MySQL:
Ver original
  1. ALTER TABLE articulos
  2. ADD FOREIGN KEY (CodLinea) REFERENCES Lineas(CodSistema);

pero da el siguiente error:
Código MySQL:
Ver original
  1. Error Code : 1005
  2. Can't create table 'preventa.#sql-1b8_1' (errno: 150)

Probé también agregar la clave en modo diseñador (uso SQLyog), con el siguiente código generado:
Código MySQL:
Ver original
  1. alter table `preventa`.`articulos` add constraint `FK_articuloslineas` FOREIGN KEY (`CodLinea`) REFERENCES `lineas` (`CodSistema`) ON DELETE NO ACTION  ON UPDATE NO ACTION

Y sale este error:
Código MySQL:
Ver original
  1. Can't create table 'preventa.#sql-1b8_1' (errno: 150) al agregar clave foranea con alter table

¿Qué diablos es el problema aquí? Apenas estoy comenzando a crear tablas no sé porqué diablos no lo hace. Busqué en internet y es el código correcto para alterar tablas... qué rayos!!!

Por fa les pido que respondan mi post, he creado varios otros y jamás me los han respondido...

Última edición por gnzsoloyo; 28/07/2015 a las 09:18
  #2 (permalink)  
Antiguo 28/07/2015, 09:20
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, 3 meses
Puntos: 2658
Respuesta: Error al querer agregar clave foránea con 'alter table'

Por empezar, para analizar correctamente el problema hay que concoer con precisión la estructura de las tablas que estás intentando relacionar, por lo que que nos postearas el resultado de estas dos queries:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE articulos;
Código MySQL:
Ver original
  1. SHOW CREATE TABLE Lineas;

En segundo lugar, la pregunta esencial: ¿Hay datos en ambas tablas?
__________________
¿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 28/07/2015, 13:09
Avatar de raffskizze  
Fecha de Ingreso: marzo-2004
Ubicación: ...
Mensajes: 433
Antigüedad: 20 años
Puntos: 0
Respuesta: Error al querer agregar clave foránea con 'alter table'

Puede ser que tus tablas sean Mysam en vez de innodb y por eso no te deja. Revisa eso.
__________________
echo ( www.tutorial-enlace.net == tutoriales gratis ) ? 'Aprenderas gratis !!' : 'No aprenderas !!';
  #4 (permalink)  
Antiguo 28/07/2015, 13: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, 3 meses
Puntos: 2658
Respuesta: Error al querer agregar clave foránea con 'alter table'

Precisamente por eso le pido los SHOW CREATE TABLE...
Si son MyISAM, se acaba la discusión, pero si no, es probable que se deba a otras causas que son visibles con el resultado de las queries que le pido.

El ser MyISAM no es la única posibilidad.
__________________
¿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 29/07/2015, 06:38
Avatar de raffskizze  
Fecha de Ingreso: marzo-2004
Ubicación: ...
Mensajes: 433
Antigüedad: 20 años
Puntos: 0
Respuesta: Error al querer agregar clave foránea con 'alter table'

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Precisamente por eso le pido los SHOW CREATE TABLE...
Si son MyISAM, se acaba la discusión, pero si no, es probable que se deba a otras causas que son visibles con el resultado de las queries que le pido.

El ser MyISAM no es la única posibilidad.
Por eso dije "puede ser"
__________________
echo ( www.tutorial-enlace.net == tutoriales gratis ) ? 'Aprenderas gratis !!' : 'No aprenderas !!';
  #6 (permalink)  
Antiguo 29/07/2015, 11:34
Avatar de socosa  
Fecha de Ingreso: junio-2015
Ubicación: Asunción
Mensajes: 12
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Error al querer agregar clave foránea con 'alter table'

Hola a todos, gracias por responder...

El problema lo solucioné creando la clave foránea con el Id de la tabla de origen, no con el campo CodSistema...

No me parece que deba solucionarse así: En Interbase-Firebird sí podía relacionar clave foránea con campo que no es clave primaria en su tabla de origen...

El tipo es InnoDB. Respecto a si tienen datos cargados, todavía no, porque recién estoy creando la estructura de las tablas (como son muchas me está llevando tiempo).

Nunca tuve que cargar datos en las tablas para poder crear las relaciones foráneas.

Probaré el código sql que me muestran y diré el resultado.
  #7 (permalink)  
Antiguo 29/07/2015, 11:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: Error al querer agregar clave foránea con 'alter table'

que se pueda hacer en un DBMS no quiere decir que se pueda hacer en otro, por ejemplo en SQL no puedes hacer eso a menos que el campo sea llave primaria o en su defecto que tenga el constraint UNIQUE, la pregunta de si tenias datos era porque cuando hay datos es mas complicado que te deje hacer las relaciones :O
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 29/07/2015, 11:49
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, 3 meses
Puntos: 2658
Respuesta: Error al querer agregar clave foránea con 'alter table'

Ok.
En primer lugar, es evidente que estás empezando y que no has estudiado en profundidad lo que es una foreign key, o clave foránea, porque de lo contrario no podrías haber plenteado esto:
Cita:
El problema lo solucioné creando la clave foránea con el Id de la tabla de origen, no con el campo CodSistema...
Entendamos bien el concepto:
Una clave foránea (FK) es un campo o conjunto de campos que referencia a la clave primaria de otra tabla, con lo que para ser definida no puede apuntar a otro tipo de campo..
Ahora , una salvedad: La primera razón de que una FK apunte a la PK de otra tabla es que debe existir una relación de unicidad d la clave a que se hace referencia, es decir, el campo de la tabla referida no puede tener dos registros con iguales valores en ese campo.
Esto no es un invento, es uno de los fundamentos del modelo relacional y no se lo peude transgredir.
Ahora bien, existe una posibilidad que algunos DBMS implementan de apuntar una FK a otro campo que no sea PK en su tabla, pero eso sólo es posible si el campo referido cumple la condición de unicidad, es decir, si no es PK de su tabla, debe forzosamente ser UNIQUE.
¿Se entiende?
Desconozco los detalles de Interbase, pero estimo que esa es una condición que deben tener los casos que tu has visto en ese DBMS, o de lo contrario la FK no puede existir.
En ese tipo de FK no existe un error o una "ventaja" de un DBMS, sino que se cumple que nunca hay dos registros con igual valor en la clave UNIQUE. Asi de simple, por lo que sigue cumpliendose el modelo relacional.

¿Queda más claro?

En tu caso, lo que sin duda ha pasado es que estabas intentando apuntar a un campo que no habías declarado como UNIQUE, y MySQL no te lo iba a permitir.
Con sólo que hubieses creado un indice UNIQUE sobre ese "CodSistema", no hubieses tenido problemas.

Por lo demás, ¿me puedes explicar por qué tienes un "ID" en la tabla como "PK", si con el CodSistema como PK hubiese sido suficiente?

Finalmente: La próxima vez, postea lo que se te pide. Es importante que respondas, si quieres un feed-back adecuado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 29/07/2015, 12:26
Avatar de socosa  
Fecha de Ingreso: junio-2015
Ubicación: Asunción
Mensajes: 12
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Error al querer agregar clave foránea con 'alter table'

No me percaté en poner la palabra reservada 'unique', es cierto que me faltó.

Respecto a lo de claves: en la universidad dí ese concepto (que sí lo conozco), que la clave foránea es para aplicarse a las clave primaria, pero en el trabajo se dan otros manejos, que no significa 'el fin del mundo' de la programación...

El Id es auto-increment, de tipo entero, CodSistema es el código propio y único que dan en la empresa a sus artículos y líneas, para manejo interno, pues no usan el Id.

Y en cuanto a cómo postear el mensaje: si sabía cómo quieren que postee lo hubiera hecho, puse los datos que creí que eran los adecuados para que entiendan el problema que tenía... Total, si faltan más datos lo piden y ya, como lo hicieron...

Siempre respondo cuando me plantean algo en los foros...

Gracias. Pondré 'unique' a mis campos principales.
  #10 (permalink)  
Antiguo 29/07/2015, 13:21
Avatar de raffskizze  
Fecha de Ingreso: marzo-2004
Ubicación: ...
Mensajes: 433
Antigüedad: 20 años
Puntos: 0
Respuesta: Error al querer agregar clave foránea con 'alter table'

Cita:
Iniciado por socosa Ver Mensaje
El Id es auto-increment, de tipo entero, CodSistema es el código propio y único que dan en la empresa a sus artículos y líneas, para manejo interno, pues no usan el Id.
Acabas de definir lo que es un ID para admitir que has duplicado un ID. xD

De todas maneras si a ti te funciona así mejor por si algún día deciden cambiar cosas con sus campos que no afecten a los de tu sistema.
__________________
echo ( www.tutorial-enlace.net == tutoriales gratis ) ? 'Aprenderas gratis !!' : 'No aprenderas !!';

Etiquetas: clave
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 23:34.