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

llaves foraneas y primary keys

Estas en el tema de llaves foraneas y primary keys en el foro de Mysql en Foros del Web. Saludos a todos, aunque tengo claro el concepto de llaves primarias y foraneas, tengo un ligero problema a la hora de realizar mis diseños y ...
  #1 (permalink)  
Antiguo 26/08/2008, 10:01
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
llaves foraneas y primary keys

Saludos a todos, aunque tengo claro el concepto de llaves primarias y foraneas, tengo un ligero problema a la hora de realizar mis diseños y luego transformarlos en las tablas correspondientes, he utilizado dbdesigner4 y TOAD Data modeler, en ambos casos, creo las relaciones tal y como deberia de ser, etc etc, a la hora de genera los scripts, me genera codigo en el cual mySql me responde con error, ej: el siguiente codigo es parte de lo que me generan

Código:
Create table paises (
	pais_id Int NOT NULL AUTO_INCREMENT,
	pais_nombre Varchar(50),
 Primary Key (pais_id)) ENGINE = InnoDB;

Create table clientes (
	pais_id Int NOT NULL,
	cliente_id Int NOT NULL AUTO_INCREMENT,
	cliente_nombre Varchar(50),
 Primary Key (pais_id,cliente_id)) ENGINE = InnoDB;

Create table carteras (
	pais_id Int NOT NULL,
	cliente_id Int NOT NULL,
	cartera_id Int NOT NULL AUTO_INCREMENT,
	despacho_id Int NOT NULL,
	agencia_id Int NOT NULL,
	gestor_id Int NOT NULL,
	cartera_nombre Varchar(50),
 Primary Key (pais_id,cliente_id,cartera_id)) ENGINE = InnoDB;


Alter table clientes add Foreign Key (pais_id) references paises (pais_id) on delete  restrict on update  restrict;
Alter table carteras add Foreign Key (pais_id,cliente_id) references clientes (pais_id,cliente_id) on delete  restrict on update  restrict;
Alter table carteras_metas add Foreign Key (pais_id,cliente_id,cartera_id) references carteras (pais_id,cliente_id,cartera_id) on delete  restrict on update  restrict;
Alter table comisiones add Foreign Key (pais_id,cliente_id,cartera_id) references carteras (pais_id,cliente_id,cartera_id) on delete  restrict on update  restrict;
Alter table cuentas add Foreign Key (pais_id,cliente_id,cartera_id) references carteras (pais_id,cliente_id,cartera_id) on delete  restrict on update  restrict;
ahora bien al ejecutar el codigo, la tabla paises la genera bien, pero al generar la tabla clientes, que es la segunda me da el siguiente error:

Sql Error: Incorrect table definition, there can be only one auto column and it must defined as a key
En TOAD Data modeler, ejecuto el verificador del diseño y no me arroja ni warnings ni errores, realmente no entiendo que pasa, mi deficiencia es que nunca habia utilizado mysql para un proyecto grande como el que desarrollo ahora, en el que es importante la integridad referencial y las relaciones, asi que espero y alguien pueda darme luces. Gracias
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #2 (permalink)  
Antiguo 26/08/2008, 10:08
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Respuesta: llaves foraneas y primary keys

No puedo creer lo que es.... por favor pueden cerrar el thread, no sin antes exponer cual era el problema.... mi experiencia ha sido con MS SQL (en su mayoria de tiempo) y yo podia definir mi primary key con varios campos (algo que con mysql puedo tambien) pero por cuestion de como me enseñaron en mssql, yo definia en mi caso
TABLA PAISES(pais_id,pais_nombre) CLIENTES (pais_id,cliente_id autoincrement, cliente_nombre) pero resulta que en mysql no puedo hacer eso la tabla clientes tiene que quedar con su primary key como primer campo CLIENTES (cliente_id autoincrement, pais_id, cliente_nombre) al invertir esto, ya no recibi el error en mysql, ahora bien no me queda claro PORQUE?????????
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #3 (permalink)  
Antiguo 26/08/2008, 15:53
 
Fecha de Ingreso: diciembre-2006
Mensajes: 127
Antigüedad: 17 años, 4 meses
Puntos: 1
Información Respuesta: llaves foraneas y primary keys

Cita:
Iniciado por xcars Ver Mensaje
No puedo creer lo que es.... por favor pueden cerrar el thread, no sin antes exponer cual era el problema.... mi experiencia ha sido con MS SQL (en su mayoria de tiempo) y yo podia definir mi primary key con varios campos (algo que con mysql puedo tambien) pero por cuestion de como me enseñaron en mssql, yo definia en mi caso
TABLA PAISES(pais_id,pais_nombre) CLIENTES (pais_id,cliente_id autoincrement, cliente_nombre) pero resulta que en mysql no puedo hacer eso la tabla clientes tiene que quedar con su primary key como primer campo CLIENTES (cliente_id autoincrement, pais_id, cliente_nombre) al invertir esto, ya no recibi el error en mysql, ahora bien no me queda claro PORQUE?????????

En mi opinion estas declarando "pais_id" en la tabla clientes como primary key y a la vez como foreign key algo que no esta permitido, recuerda que tienes tablas padre y tablas hijo....

Saludos
  #4 (permalink)  
Antiguo 26/08/2008, 16:40
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: llaves foraneas y primary keys

Cita:
Iniciado por xcars Ver Mensaje
Código:
Create table paises (
	pais_id Int NOT NULL AUTO_INCREMENT,
	pais_nombre Varchar(50),
 Primary Key (pais_id)) ENGINE = InnoDB;

Create table clientes (
	pais_id Int NOT NULL,
	cliente_id Int NOT NULL AUTO_INCREMENT,
	cliente_nombre Varchar(50),
 Primary Key (pais_id,cliente_id)) ENGINE = InnoDB;
Sql Error: Incorrect table definition, there can be only one auto column and it must defined as a key
MySQL te está dicendo que no puedes tener más de 1 columna auto_increment y que tiene que ser definida como el único campo dentro de una llave KEY.

Cita:
Iniciado por xcars Ver Mensaje
...pero resulta que en mysql no puedo hacer eso la tabla clientes tiene que quedar con su primary key como primer campo CLIENTES (cliente_id autoincrement, pais_id, cliente_nombre) al invertir esto, ya no recibi el error en mysql, ahora bien no me queda claro PORQUE?????????
Yo creo que no es completamente cierto.
Al invertir la instrucción MySQL "genera el mismo error".
Lo que puede haber sucedido es que sacaste la otra parte de la PRIMARY KEY.

Código:
Create table clientes (
	cliente_id Int NOT NULL AUTO_INCREMENT,
	pais_id Int NOT NULL,
	cliente_nombre Varchar(50),
 Primary Key (cliente_id)) ENGINE = InnoDB;
Saludos,

ps:

Que un campo sea primary key y foreign key al mismo tiempo no tiene nada que ver, yo uso muchas estructuras así para relaciones 1-1. (Pero no auto_increment)

Última edición por HackmanC; 26/08/2008 a las 16:54 Razón: unico
  #5 (permalink)  
Antiguo 26/08/2008, 16:52
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Respuesta: llaves foraneas y primary keys

Lamento contradecirte, unicamente cambie el orden de los campos, y el error ya no se genero.... y es mas ya genere el script, lo corri y me creo todas las tablas con 0 errores, no entiendo porque el campo llave principal tiene que ser el primero.....

Cita:
Iniciado por HackmanC Ver Mensaje
MySQL te está dicendo que no puedes tener más de 1 columna auto_increment y que tiene que ser definida como el único campo dentro de una llave KEY.



Está realmente incorrecto.
Al invertir la instrucción MySQL "GENERA EL MISMO ERROR".
Lo que puede haber sucedido es que sacaste la otra parte de la PRIMARY KEY.

Código:
Create table clientes (
	cliente_id Int NOT NULL AUTO_INCREMENT,
	pais_id Int NOT NULL,
	cliente_nombre Varchar(50),
 Primary Key (cliente_id)) ENGINE = InnoDB;
Saludos,

ps:

Que un campo sea primary key y foreign key al mismo tiempo no tiene nada que ver, yo uso muchas estructuras así para relaciones 1-1. (Pero no auto_increment)
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #6 (permalink)  
Antiguo 26/08/2008, 16:58
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: llaves foraneas y primary keys

Hola,

No hay problema que me contradigas,
yo solamente estaba haciendo una prueba con tu código,
pero creo que fuí un poco imponente, lo cual corregí dos minutos después.

Cambiando el orden de los campos y el orden de los campos en las llaves ... si funciona.
Por lo tanto no tiene que ser la única llave como incorrectamente escribí anteriormente.

Y después de revisar la documentación, no creo que exista una explicación clara,
yo lo tomaría como un error en la "documentación" de las instrucciones SQL en MySQL.

http://dev.mysql.com/doc/refman/5.1/...-handling.html

Saludos,

ps:

NO TE HABLO POR QUE NO SOY SUBVERSIVO.
JI,JI ... ES UNA BROMA.

Última edición por HackmanC; 26/08/2008 a las 17:24
  #7 (permalink)  
Antiguo 26/08/2008, 17:16
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Respuesta: llaves foraneas y primary keys

jajajajajjajajajajj si, a mi me parece extraño tambien el porque tiene que ser el primer campo..... y no encontre info... pero ojala que lo aqui hablado le sirva a alguien mas pk pase un par de dias peleando jejej pensando en que estaba haciendo mal las relaciones, etc etc

Cita:
Iniciado por HackmanC Ver Mensaje
Hola,

No hay problema que me contradigas,
yo solamente estaba haciendo una prueba con tu código.

Cambiando el orden de los campos y el orden de los campos en las llaves ... si funciona. Por lo tanto no tiene que ser la única llave como incorrectamente escribí anteriormente.

Y después de revisar la documentación, no creo que exista una explicación clara,
yo lo tomaría como un error en el "parser" de las instrucciones SQL en MySQL.

Saludos,

ps:

NO TE HABLO POR QUE NO SOY SUBVERSIVO.
JI,JI ... ES UNA BROMA.
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #8 (permalink)  
Antiguo 26/08/2008, 17:53
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: llaves foraneas y primary keys

Hola,

Realmente si es un problema bastante especial.
Es interesante que te ocurrió exactamente ese incoveniente.

Aunque es algo que está en la documentación de como funciona AUTO_INCREMENT en InnoDB.

"An AUTO_INCREMENT column must appear as the first column in an index on an InnoDB table."

http://dev.mysql.com/doc/refman/5.1/...-handling.html

Creo que he yo también he aprendido algo nuevo de InnoDB.
Espero haber sido de alguna ayuda.

Saludos,
  #9 (permalink)  
Antiguo 27/08/2008, 12:45
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Respuesta: llaves foraneas y primary keys

hey buenisimo, menos mal que me salte esa parte de como funciona innoDB en el manual de mysql jajajjajaj no pk hubiera estado enterado, gracias por la info me parece excelente.

Cita:
Iniciado por HackmanC Ver Mensaje
Hola,

Realmente si es un problema bastante especial.
Es interesante que te ocurrió exactamente ese incoveniente.

Aunque es algo que está en la documentación de como funciona AUTO_INCREMENT en InnoDB.

"An AUTO_INCREMENT column must appear as the first column in an index on an InnoDB table."

http://dev.mysql.com/doc/refman/5.1/...-handling.html

Creo que he yo también he aprendido algo nuevo de InnoDB.
Espero haber sido de alguna ayuda.

Saludos,
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 04:57.