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

Actualización de datos pero sin usar la llave primaria

Estas en el tema de Actualización de datos pero sin usar la llave primaria en el foro de Bases de Datos General en Foros del Web. Saludos amigos forosdelwebianos: Necesito consejo, bueno, estoy haciendo un formulario de agregar clientes a una base de datos, pero esta vez estoy dando la Id ...
  #1 (permalink)  
Antiguo 30/12/2009, 04:51
Avatar de GabrielAngelos  
Fecha de Ingreso: septiembre-2008
Ubicación: Tacna
Mensajes: 36
Antigüedad: 15 años, 7 meses
Puntos: 0
Actualización de datos pero sin usar la llave primaria

Saludos amigos forosdelwebianos:

Necesito consejo, bueno, estoy haciendo un formulario de agregar clientes a una base de datos, pero esta vez estoy dando la Id autoincrementable, asi que las acciones que se tomen sobre la base de datos creo yo no sé si estaré equivocado ya no va a depender de la llave primaria del registro o Id, así que no estoy considerando en las operaciones SQL el campo Id, por lo que me queda solo usar un campo que creo yo debo indexar que es el numero de documento de identidad que por suerte es "único" también.

Así que cuando quiera actualizar el nombre, simplemente haré un update en función a su numero de identidad que la tengo visible en formulario, ni como hidden.

Ya que el campo de identidad es unico pero no es primaria, asi que existe un riesgo de modificacion y repetición, desde base de datos, que debo hacer para impedir que se duplique ese campo, o en terminos generales que precauciones debo tomar o qué técnicas debo implementar.

Desde ya muchos saludos.
  #2 (permalink)  
Antiguo 30/12/2009, 05: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, 5 meses
Puntos: 2658
Respuesta: Actualización de datos pero sin usar la llave primaria

Si no usas una PK, puedes usar una CC, por ese lado no habría problemas. Pero, para mayor claridad: ¿qué DBMS está usando?
__________________
¿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 30/12/2009, 05:41
Avatar de Sergiorelativo  
Fecha de Ingreso: diciembre-2009
Ubicación: Cadiz
Mensajes: 259
Antigüedad: 14 años, 4 meses
Puntos: 6
Respuesta: Actualización de datos pero sin usar la llave primaria

Sin conocer tu base de datos podria decirte que no habría ningún problema en actualizar registros usando una clave candidata o única. ¡Saludos!
  #4 (permalink)  
Antiguo 30/12/2009, 16:53
Avatar de GabrielAngelos  
Fecha de Ingreso: septiembre-2008
Ubicación: Tacna
Mensajes: 36
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Actualización de datos pero sin usar la llave primaria

hola gracias gnzsoloyo y sergiorelativo por sus respuestas, la base de datos es MYSQL y estos son los campos

cliente_id (autonincrementable)
cliente_nombre (cualquier nombre)
cliente_tipoidentificacion (DNI, pasaporte, etc)
cliente_nroidentifcacion(XXXXX numeros de identificacion)
cliente_correo(correo del cliente)

De aquí yo noto que nro de identificacion y correo son datos unicos para un cliente, a pesar de no ser llaves primarias que evite su redundancia, simplemente no va a pasar nada porque en si mismas, los campos contienen datos unicos,

O sea: UPDATE .. . WHERE cliente_correo = campodetextodecorreodecliente
o sino: UPDATE ..... WHERE cliente_nroident = campodetextodenrodeidentificacion

Luego en mi formulario selecciono un cliente y sus datos estan desplegados en los campos de formulario que tmabien utilizo para agregar, con un boton, puedo desplegar los datos de un cliente seleccionado, ahora para proceder a actualizar, cambio en ese mismo formulario los datos y presiono en vez de agregar actualizar, donde el campo de nro de identificacion se mantenga intacto o el de correo intacto y funciona.

De aqui puedo intuir que puedes cambiar todos los datos menos el campo donde dice WHERE porque el UPDATE necesita un apoyo para actualizar que es el WHERE y que esta desplegado en el formulario.

Pero que pasa si un cliente me dice que ahora tiene nuevo correo, entonces selecciono sus datos antiguos y cambio el correo, pero no va a actualizar porque el update where se basa en el dato antiguo para actualizar, o sea si antes en el registro estaba guardado como [email protected], y me dice que cambie a [email protected] no va a encontrar ese dato en la tabla y por lo tanto no va a haber actualizacion.

Las soluciones que se me ocurren son estas

Agregar un nuevo campo llamado cliente_alias y que sea la primera letra de su nombre apellido mas un numero, y actualizar en funcion a este alias porque es como un casillero que puede contener a cualqueir persona.

Consultar en funcion al dato antiguo y que me devuelva mediante select la id caulquiera que sea y actualizar en funcion a esa id que obtuve mediante select.

Guardar en una variable el dato previo antes de la actualización de correo electronico o numero de identificacion que son campos candidatos.

Es a eso lo que se refieren sergiorelativo y gnzsoloyo con crear un campo cliente_alias?? hay alguna otra forma posible de hacer este proceso sin depender de la id que es autoincrementable y no tengo acceso?? si debo basarme en correo electronico o numero de identificacion, como resuelvo cuando alguien quiera cambiar estos datos?? porque mi formulario no es distinto uno para agregar y otro para actualizar. sino son lo mismo con botones para agregar y actualizar.

Saludos y muchas gracias de antemoano

Última edición por GabrielAngelos; 30/12/2009 a las 16:57 Razón: Se me ocurrio una nueva solucion
  #5 (permalink)  
Antiguo 30/12/2009, 17:46
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, 5 meses
Puntos: 2658
Respuesta: Actualización de datos pero sin usar la llave primaria

Vamos por partes (decía Jack el Destripador):
Primero que nada, no te compliques tratando de deducir cosas que ya están resueltas de antemano. Simplemente hay que saber cómo funcionan, y cuándo aplicarlas...

Sabemos que:
  • De acuerdo al modelo relacional, toda relación (tala del modelo físico) tiene que poseer una clave primaria, la que debe ser única, no nula e identificar unívocamente a una única tupla de la relación.
  • De acuerdo a las técnicas de normalización, pueden hallarse en una relación dada, una o más de una clave candidata. Pero solo una es efectiva y eficiente. Cuál es la efectiva y eficiente, eso es un tema de análisis de otro nivel. A las formas normales no les importa en tanto se cumplan sus requerimientos.
  • Como regla general, para poner una relación en 3FN, todos los atributos de la relación deben depender completamente de la clave, y sólo si no existe una CC posible, entonces se debe agregar una clave artificial, preferentemente numérica.

Infortunadamente, cuando llega el momento de crear las tablas, es mucho más fácil para el diseñador poner una clave autoincremental, que tratar de ceñirse a las FN. , y por eso terminan inventando PK numéricas en todas las tablas, incluyendo las que no lo necesitan.

En tu caso, el cliente_nroidentifcacion podría ser una clave efectiva y eficiente... salvo por un problema: Estás proponiendo que pueda haber más de un tipo de documento de donde tomar ese dato, y eso puede producir problemas, ya que no puedes establecer si documentos de diferentes orígenes no puedan compartir números, aún siendo diferentes personas.
Si nos atenemos al modelo de FN, requeriría de otro atributo para darle seguridad, o reducir los tipos de documento a uno sólo (que en bases de datos de uso global no es posible). Cualquier otra opción generará inconsistencias eventualmente.

La dirección de correo electrónico es mucho más eficiente en este caso que el número de documento para este fin, pero adolece de un problema: Ocupará mucho espacio almacenarlas (8 bytes máximo de un BIGINT contra más de 250 de un VARCHAR). Esto puede traer ciertos problemas a la hora de contar el almacenaje y también en las actualizaciones, debido a los índices. De todos modos puede ser que convenga.
Aún así, este caso requiere que antes de guardar un registro nuevo se verifique contra la base que no exista ya otro registro con el mismo e-mail. No te olvides que el hecho de que alguien lo use no significa que le pertenezca... Y con eso puede darse que se dupliquen.
Revisa bien cuál atributo o grupo de atributos te servirá de PK si no quieres usar un autoincremental.


Cita:
Pero que pasa si un cliente me dice que ahora tiene nuevo correo, entonces selecciono sus datos antiguos y cambio el correo, pero no va a actualizar porque el update where se basa en el dato antiguo para actualizar, o sea si antes en el registro estaba guardado como [email protected], y me dice que cambie a [email protected] no va a encontrar ese dato en la tabla y por lo tanto no va a haber actualizacion.
Esto es un problema estrictamente de SQL.
Cuando se hace un UPDATE de una PK es conveniente saber dos cosas:
1) Si la PK se usa como FK en otras tablas, en esas debe estar definida como ON UPDATE CASCADE, para no tener que realizar cambios manualmente.
2) Un UPDATE no opera, como pareces decir, actualizando primero y comparando después. No. Actualiza luego de encontrar, lo que significa que sólo cuando haya ubicado el registro físico realiza el cambio. No antes. Y en ese momento no está apuntando a la clave, sino al registro...

No te preocupes de cómo hace. Simplemente lo hace.
__________________
¿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 30/12/2009, 20:08
Avatar de GabrielAngelos  
Fecha de Ingreso: septiembre-2008
Ubicación: Tacna
Mensajes: 36
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Actualización de datos pero sin usar la llave primaria

Interesante respuesta gnzsoloyo muchas gracias por responder me ha servido bastante, toda la información me la voy a quedar para aplicarla, pero en la parte última, en realidad si entiendo que un UPDATE encuentra y luego actualiza, lo que sucede es que por ejemplo:

el registro que tiene estos datos

BD

ID: 1
Nombre: Rodrigo
NroDocumento: 45558877

Físicamente está guardado por ejemplo de esa manera, entonces lo que hago es llamar esos datos y ponerlos en un formulario algo así

Interfaz de usuario

Nombre de cliente: Rodrigo
Numero de documento de cliente: 45558877

Los datos estan desplegados en cajas de texto, si yo hago una actualización en función al campo de texto, entonces solo va a funcionar si cambio el nombre del cliente en la interfaz, en cambio no va a funcionar si actualizo el numero de documento a 8888888 porque el update sera WHERE numerodedocumento = campodetexto-numerodedocumento(o sea 8888888) y ese 8888888 no existe en la tabla porque fisicamente aun sigue con 45558877 en la base de datos.

Entonces he revisado que lo que se puede hacer respetando las cosas que dices que tienes razón es guardar previamente el numerodedocumento en una variable antes de cambiarla para que al final quede la consulta asi: UPDATE tablacliente set NroDocumento = 8888888 where NroDocument = 45558877.

Eso soluciona la actualizacion de numero de documento :D, pero lo malo es como tu dices las cuestiones tecnicas de tomarla como llave candidata, voy a profundizar más el análisis creo que el tema va tambien por el de relación identificada y no identificada, que son justamente conceptos que no sé de que tratan pero algo me dice que por ahi va el tema.

Muchas gracias por compartir técnica y teoría gnzsoloyo.
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 05:05.