Ver Mensaje Individual
  #4 (permalink)  
Antiguo 29/01/2016, 12:13
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, 3 meses
Puntos: 2658
Respuesta: errores de sintraxis??

Cita:
El nombre generico 'id' no lo elegi yo, estoy siguiendo un ejemplo del libro y en la documentacion lo llaman asi(simplemente eso), pero ¿no crees que al hacer un JOIN de varias tablas(3-4) seria ventajoso en la condicion tener un campo de igual nombre en todas ellas?? seria tan simple como poner en la condicion ...USING(id), en lugar del 'infinito' ON
No exactamente... El campo debe tener el mismo nombre si y sólo si pertenece al mismo dominio, cosa que no suele suceder en la realidad.

Vamos a ver si se entiende:
Supongamos que tienes tres tablas: FACTURA, DETALLE_FACTURA y PRODUCTO, y que los tres usan el "ID" como PK.
Podrías tranquilamente hacer un
Código MySQL:
Ver original
  1. SELECT ...
  2. FROM factura F
  3.     INNER JOIN detalle_factura DF USING(id)
  4.     INNER JOIN producto P USING(id)
  5. ...
Tal consulta no te daría error, pero...
FACTURA.ID es el numero de la factura.
DETALLE_FACTURA.ID es el numero de un item de la factura (suponiendo que no se reinicien las numeraciones por cada una)
PRODUCTO.ID es el numero de producto.

En ese contexto, estarías mezclando caballos, manzanas y serruchos, porque a una factura dada se la emparejaría con un item con igual numero, aunque no pertenezca a la misma factura, y con un producto cuyo numero sea igual al de la factura... que puede ser cualquiera, incluyendo los que no se facturaron en ella.

¿Se entiende la idea?

No es tan simple como poner un nombre estandarizado como ID, sino que el mismo nombre de la PK debe estar en la tabla donde la misma es FK...
¿Se entiende?
En ese contexto, si usas "ID" en una tabla, pero la otra tiene su propio campo "ID", no puedes hacerlo porque comparten nombres y son datos diferentes.
¿Qué haces entonces?
Pones ID en una tabla y donde es FK le pones, por ejemplo ID_PRODUCTO, con lo cual el USING ya no sirve.
Por ESO es que como regla de buenas prácticas, toda PK debe tener un sufijo o prefijo que identifique la tabla de origen, y le permita ser nombre único en toda la base.

En el ejemplo que te doy sería:
Cita:
FACTURA(factura_nro, ...)
DETALLE_FACTURA(factura_nro, ..., producto_id, ...)
PRODUCTO(producto_id, ...)
y en ese contexto, SI puedes escrbir:
Código MySQL:
Ver original
  1. SELECT ...
  2. FROM factura F
  3.     INNER JOIN detalle_factura DF USING(factura_nro)
  4.     INNER JOIN producto P USING(producto_id)
  5. ...

Nota bene: Los libros, especialmente los que no son los manuales oficiales de referencia de un DBMS, están llenos de metidas de pata y ejemplos malos.
Para encontrar ejemplos correctos tienes que acudir a los manuales de referencia, donde raramente usan nombres de columna de esa clase...

Posdata: Escribo largo y detallado porque ese es mi estilo, y además como analista funcional de BBDD, tengo que escribir cosas para que las entiendan usuarios que no son de BBDD. Y entonces hay que ser detallado y meticuloso, incluso si parece redundante.

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