Ver Mensaje Individual
  #9 (permalink)  
Antiguo 29/12/2013, 20:22
Avatar de gnzsoloyo
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)