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

Llave primaria y foranea

Estas en el tema de Llave primaria y foranea en el foro de Mysql en Foros del Web. Buenas... Vengo creando una base de datos pero tuve un problema con mi compu y pase de windows de 32 a uno de 64 no ...
  #1 (permalink)  
Antiguo 28/12/2013, 09:57
 
Fecha de Ingreso: marzo-2012
Mensajes: 21
Antigüedad: 12 años, 9 meses
Puntos: 0
Llave primaria y foranea

Buenas...

Vengo creando una base de datos pero tuve un problema con mi compu y pase de windows de 32 a uno de 64 no pude trabajar con el appserv y tuve que cambiar a xampp y volver a crear la base de datos pero dentro de las particularidades de crear base de datos relacional es un problema con las llaves primaria y foránea.
A cada tabla le creo su llave primaria y la BD funciona bien al momento de hacer el registro, pero el problema inicia cuando relaciono las tablas, por ahora todas las tablas están relacionadas con la tabla principal a través del id del usuario pero cuando creo las llaves foráneas y las relaciono con la principal ya no me funciona la BD y no me realiza el registro en las tablas salvo la principal.
La verdad no se que pasa, las llaves foráneas las creo con alter table y les doy on delete cascade y on update cascade; y como decía al crearlas se crean bien no hay problema pero al querer realizar el registro ya no se ingresa ningun datos desde el formulario.

El código php es el básico para realizar insert, esta bien por que antes de crear las llaves foráneas funciona bien, y el código de crear la BD en mysql es el que todos sabemos, lo que quiero entender es por que antes de crear las llaves foráneas se ingresan los datos y después de crear la llaves foráneas ya no funciona la inserción de datos.

Agradezco de antemano la colaboración por que llevo meses buscando soluciones y volviendo a crear una y otra vez la BD pero nada funciona.

Bendiciones....
  #2 (permalink)  
Antiguo 28/12/2013, 10:37
Avatar de Aoshy  
Fecha de Ingreso: noviembre-2012
Ubicación: Chiclayo
Mensajes: 11
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Llave primaria y foranea

hola migferpedia77 que herramientas usas para crear tu BD, en mi caso yo utilizo el CASE STUDIO es un buen modelador de base de datos y su uso es parecido al ERWIN y otras mas... es fácil e intuitivo el trabajar con esta herramienta... una vez terminado tu modelado, este, te genera el SQL el cual tendrás que copiar y pegar en tu gestor de base de datos que estés utilizando. Soporta los gestores de BD mas conocidos como SQL Server, PostgreSQL, Oracle, MySQL, Informix, DB2 entre muchas mas
  #3 (permalink)  
Antiguo 28/12/2013, 11: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: 17 años
Puntos: 2658
Respuesta: Llave primaria y foranea

Postea los CREATE TABLE de las tablas que trabajas y eel ALTER TABLE que estás usando para relacionarlas.
Por otro lado, si las FK se crean correctamente y el sistema deja de permitir los inserts pueden darse dos situaciones diferentes:
1) Las FK determinan un orden de inserciones definido, y en tu aplicación no lo estás respetando. Este es el error más habitual y fácil de resolver. Se da específicamente porque cuando pones en B una FK apuntando a A, la tabla A debe ser la primera en insertarse y sólo con la PK creada al insertar se puede realizar la correspondiente alta en la tabla B.
2) Al crear las relaciones se definieron mal, determinando una dependencia circular. Esta es una situación imposible y representa un serio error de diseño.

Pero no se puede decir mucho más sin ver exactamente las sentencias de create table correspondientes.
Si no sabes hacerlo, es simplemente usar
Código MySQL:
Ver original
  1. SHOW CREATE TABLE nombretabla
donde "nombretabla" es el nombre de la tabla de la que necesitas saber cómo es la sentencia que la crearía.

Postea eso y veremos en detalle.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 28/12/2013, 17:21
 
Fecha de Ingreso: marzo-2012
Mensajes: 21
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Llave primaria y foranea

Hola, esto la creación de la tabla esta bien ya lo comprobé y el orden de inserción de datos esta según la creación de las tablas en mi BD.
Cuando dejo las tablas sin llaves foráneas, la inserción de los datos es correcta, pero al colocar las llaves foráneas y tratar de insertar info nuevamente ya no funciona y no escribe en ninguna tabla, lo que quiero entender es por que al colocar las llaves foráneas ya no funciona y reitero el orden de inserción de los datos es según el orden de creación de las tablas para que no haya conflicto al insertar los datos.

Será que alguien puede tener idea de por que sucede esto????
  #5 (permalink)  
Antiguo 29/12/2013, 08:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Llave primaria y foranea

¿Entendiste algo de lo que te dije?
Te lo repito: Las FK son las determinantes del orden de inserción. No la creación de las tablas. Por ende, si no podemos ver las dependencias funcionales que las FK agregadas luego de crear las tablas, definen, no podemos saber con certeza cuáles son los cambios de comportamiento que estas FK requieren ahora.
Tu estás suponiendo que todo permanece igual que al procipio, pero yo estoy medianamente seguro de que algo de esas FK ha cambiado las dependencias, y por consecuencia debe haber cambiado el comportamiento necesario.
pero sin ver los create table y los alter table que has usado, no puedo darte un diagnóstico certero de lo que pasa.

Postea lo que te pido, o ponte a analizar lo que digo en base a lo que tienes.
Confía al menos un poco en las palabras de alguien que se dedica a esto profesionalmente.
__________________
¿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 29/12/2013, 10:42
 
Fecha de Ingreso: marzo-2012
Mensajes: 21
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Llave primaria y foranea

Hola

Gracias por tu respuesta aquí van los create table.

CREATE TABLE `registro` (
`userid` int(10) NOT NULL AUTO_INCREMENT,
`vetpal` varchar(100) NOT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

CREATE TABLE `pass` (
`passid` int(10) NOT NULL AUTO_INCREMENT,
`userid` int(10) NOT NULL,
`pass` varchar(32) NOT NULL,
PRIMARY KEY (`passid`),
KEY `pass` (`userid`),
CONSTRAINT `pass` FOREIGN KEY (`userid`) REFERENCES `registro` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

están son las dos tablas que deje de las que ya había creado, y de nuevo antes de colocar el FK todo inserta bien y después de colocar el FK todo el insert se friega.
Esto lo hago en phpmyadmin de xampp con mysql.
Bueno gracias por tu ayuda y paciencia y aprecio que a pesar de mi terquedad aun quieras ayudar.

Bendiciones...
  #7 (permalink)  
Antiguo 29/12/2013, 11:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Llave primaria y foranea

En principio, no hay errores en la definición de la FK. AL menos no hay dependencias circulares. Lo que sí, según la estructura de esas tablas lo primero que debes hacer es insertar en la tabla "registro".
Luego de ese INSERT, debes recuperar el ID generado (ya que es un autoincremental) en forma automática por MySQL y ese valor debe ser puesto como valor para el campo "userid" de la tabla "pass".
¿Es así como lo estás haciendo?

Es decir, como el campo USERID es FK de la tabla REGISTRO, debe existir en su tabla antes de insertarlo en PASS.

¿Has verificado si MySQL te devuelve algún mensaje de error?
Porque cualquier insert que falle por violación de constraint genera un mensaje de error.
__________________
¿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; 29/12/2013 a las 19:51
  #8 (permalink)  
Antiguo 29/12/2013, 20:09
 
Fecha de Ingreso: marzo-2012
Mensajes: 21
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Llave primaria y foranea

Hola nuevamente y gracias por tu aclaración; en este momento creo que no estoy haciendo lo de recuperar el dato generado para el userid de la tabla registro y luego colocarlo en el userid de la tabla pass, pregunta, ese dato lo recupero con un select o de que forma. La verdad ingreso todos los datos de las tablas de una sola vez, así:
Código MySQL:
Ver original
  1. INSERT INTO registro(vetpal)VALUES('$vetpal')

Código MySQL:
Ver original
  1. INSERT INTO pass(pass)VALUES('$userpass')

entonces por favor ayúdame con la aclaración de recuperar el dato de userid que es autoincremental y gracias por toda tu colaboración, me gusta estos sitios donde uno puede aportar y ayudar solo por las ganas de ayudar y del conocimiento.

Bendiciones..

Última edición por gnzsoloyo; 29/12/2013 a las 20:11 Razón: Código de programación no permitido en foros de BBDD
  #9 (permalink)  
Antiguo 29/12/2013, 20:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Llave primaria y foranea

Pues bueno, esa es entonces la metida de pata... muy común en los que recién se inician.

Empecemos, para que quede claro, definiendo correctamente y para que no queden dudas, lo que es una FK:
Una FOREIGN KEY (clave foránea) es un campo o conjunto de campos que referencia a la clave primaria (PRIMARY KEY) de otra tabla.
En este sentido, siempre, todo valor que se va a ingresar a una FK debe existir siempre previamente en la tabla referida. Siempre.
Además, la FK debe ser siempre del mismo tipo de dato, del mismo rango y de la misma collation (en caso de ser de caracteres) que la PK de origen. Esto es muy importante, porque por ejemplo si la PK de origen es INT UNSIGNED, la FK no puede ser definida como INT sin el UNSIGNED, ni tampoco como BIGINT, SMALLINT, MEDIUMIT o TINYINT. Deben ser exactamente del mismo tipo.

Bien. Un campo autoincremental puede ser omitido en el INSERT, o bien reemplazado por NULL:
Código MySQL:
Ver original
  1. INSERT INTO registro(vetpal)VALUES('$vetpal')

Código MySQL:
Ver original
  1. INSERT INTO registro(userid, vetpal) VALUES(NULL, '$vetpal')
porque al ser AI, el NULL será reemplazado por el correspondiente valor.

Ahora bien, ¿cómo se recupera ese valor?
Fácil:
- En los lenguajes de programación existen funciones específicas para recuperar el valor inmediatamente después de lanzar el INSERT. En el acaso de PHP si usas la librería MYSQL, la función es mylsq_insert_id(). Esa te devuelve el valor numerico de AI, el cual pasarás a la siguiente.
- En MySQL existe la función LAST_INSERT_ID(), que cumple l amisma función, pero debe se rejecutada inmediatamente después del INSERT, y no debe haberse ni cerrado la conexión, ni tampoco ejecutado en ella ninguna otra sentencia SQL, o se perderá el valor.
Siempre puedes hacer la solución rústica:
Código MySQL:
Ver original
  1. SELECT MAX(userid) userid FROM registro WHERE vetpal = '$vetpal';
pero no te lo aconsejo por cuestiones de error probable si hay alta concurrencia de usuarios.
En todo caso, no tiene sentido usar una nueva sentencia, si ya tienes una función nativa para eso en el lenguaje que usas...

Nota final: Cuando hago referencia al principio de que una FK es "un campo o conjunto de campos", me estoy refiriendo al caso de tablas cuya PK es compuesta, es decir, está definida sobre más de una columna. En esos casos la FK debe tener la misma cantidad de campos en la tabla, del mismo tipo y en el mismo orden de la PK de referencia, y se define la FK con todos los campos al mismo tiempo.
__________________
¿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: llaves
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 15:57.