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

Sobreescribir llave única

Estas en el tema de Sobreescribir llave única en el foro de PostgreSQL en Foros del Web. Hola a todos! Estoy almacenando una serie de datos en postgresql, tienen como llave única una fecha ya que no se van a introducir datos ...
  #1 (permalink)  
Antiguo 09/10/2013, 04:05
 
Fecha de Ingreso: septiembre-2013
Mensajes: 22
Antigüedad: 11 años, 1 mes
Puntos: 0
Sobreescribir llave única

Hola a todos!
Estoy almacenando una serie de datos en postgresql, tienen como llave única una fecha ya que no se van a introducir datos distintos en un mismo día pero lo que sí quiero es que si ya existe información sobre el día 4/7/13 por ejemplo y ahora quiero cambiar dicha información, me deje sobreescribir los datos existentes. ¿cómo lo puedo hacer? Gracias!

Por cierto los datos se insertan a una base de datos postgresql a través de un formulario php

Última edición por elisu1986; 09/10/2013 a las 04:14
  #2 (permalink)  
Antiguo 09/10/2013, 11:00
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: Sobreescribir llave única

Cita:
Por cierto los datos se insertan a una base de datos postgresql a través de un formulario php
Nota: No es relevante. Lo que hagas en programación es OFF TOPIC en este foro.
Cita:
quiero cambiar dicha información, me deje sobreescribir los datos existentes.
Lo que pretendes hacer requiere dos acercamientos distintos:
- Cuando insertas uno nuevo, es un INSERT. Siempre.
- Cuando actualizas datos, es un UPDATE. Como la clave primaria ya existe, lo que se debe actualizar son el resto de los datos.

En definitiva, para hacer lo que quieres debes primer verificar si ya existe un registro con esa clave. Si no existe, insertas, si existe, actualizas.
Tan sencillo como eso.... No tiene más secretos.
__________________
¿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 09/10/2013, 12:58
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Sobreescribir llave única

Yo te recomendaría tener como primary key un campo aparte. Un autoincremental por ejemplo. El campo fecha sea UNIQUE. La actualización ahi no te genera ningún problema.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 16/10/2013, 02:33
 
Fecha de Ingreso: septiembre-2013
Mensajes: 22
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Sobreescribir llave única

Sí. La fecha es UNIQUE. Pensaba hacerlo con la orden update pero era por si había alguna otra forma. Me pongo a ello. Gracias
  #5 (permalink)  
Antiguo 23/10/2013, 04:40
 
Fecha de Ingreso: septiembre-2013
Mensajes: 22
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Sobreescribir llave única

Hola de nuevo,
He estado trabajando en este tema de la llave única y sigo sin obtener la solución. A ver si lo entiendo, ¿al especificar una fecha como llave única no me debería de sobrescribir automáticamente si inserto un dato igual? Si no fuera así ya sé que tengo que utilizar la orden update pero ¿cómo hago para saber si la fecha introducida en el formulario ya existe en la base de datos? he intentado comprobarlo con una sentencia if pero no funciona. La otra opción que veo es crear un nuevo formulario que en vez de insertar modifique los datos que haya almacenados pero quiero evitar esto porque son muchos, por eso prefiero que me sobrescriba al introducir un dato igual. Gracias
  #6 (permalink)  
Antiguo 25/10/2013, 14:01
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: Sobreescribir llave única

Cita:
A ver si lo entiendo, ¿al especificar una fecha como llave única no me debería de sobrescribir automáticamente si inserto un dato igual?
No. El índice UNIQUE dispara un error al intentar realizar un INSERT con una clave ya existente. Por definición, ese es el comportamiento esperado.
Cita:
Si no fuera así ya sé que tengo que utilizar la orden update pero ¿cómo hago para saber si la fecha introducida en el formulario ya existe en la base de datos?
¿Cómo?
Haciendo lo que hacemos todos: Realizando una consulta de verificación previa... No hay otro camino. Todas las aplicaciones que conoces funcionan así.
Las restricciones de bases de datos están diseñada precisamente para ayudarte a no meter la pata, y no para que las cosas te resulten fáciles.
Cita:
La otra opción que veo es crear un nuevo formulario que en vez de insertar modifique los datos que haya almacenados pero quiero evitar esto porque son muchos, por eso prefiero que me sobrescriba al introducir un dato igual.
En este caso te sugiero diseñar un sistema de actualización masiva, que implicaría recolectar primero todos los cambios a realizar, y luego procesarlos. Caso contrario sólo te queda hacerlo uno a uno.
En sistemas de manejo masivo de datos, es normal preparar precisamente funcionalidades para realizar actualizaciones masivas. Se diseñan para ese tipo de contingencias. Pero si el cambio debe ser rápido, no son funcionales.
__________________
¿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; 25/10/2013 a las 14:08
  #7 (permalink)  
Antiguo 27/10/2013, 04:47
 
Fecha de Ingreso: septiembre-2013
Mensajes: 22
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Sobreescribir llave única

Sí, ya sé que tengo que hacer una verificación previa. Lo hice así y no me comprueba nada..

Código MySQL:
Ver original
  1. select * from visitas

Cita:
Editado: Código de programacion no permitido en foros de Bases de Datos.
Ya sé dónde está el fallo.Cuando imprimo la fecha almacenada en la base de datos me la muestra así: 2013-10-27 (d-m-a) y cuando imprimo fecha que seleccionada en el calendario del formulario me la muestra así: 27/10/2013. Puedo cambiar el formato del calendario al mismo de la base de datos pero aquí usamos el formato dd-mm-yyyy así que prefiero cambiar el formato de la base de datos si no es muy complicado. La fecha se almacena en un tipo de variable date

Última edición por gnzsoloyo; 27/10/2013 a las 05:30
  #8 (permalink)  
Antiguo 27/10/2013, 05:37
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: Sobreescribir llave única

Bien, por un lado no estás entendiendo a qué nos referimos cuando en Bases de DAtos hablamos de hacer comprobaciones previas.
Una comprobación previa no implica que leas toda la tabla y luego verifiques contra lo obtenido programáticamente. Nadie hace semejante cosa.
Lo que debes hacer es consultar por la existencia de registros que cumplan con la clave primaria:
Código MySQL:
Ver original
  1. SELECT COUNT(*) existe
  2. FROM visitas
  3. WHERE fecha = '2013-10-24';
Con eso alcanza. Si devuelve algo diferente de cero, haces un UPDATE, y si devuelve cero un INSERT.
Tan sencillo como eso.

Respecto a las fechas,es un tema muy común en los principiantes: Las fechas en la bases de datos deben guardarse siempre como DATE, DATETIME o TIMESTAMP, y jamás como VARCHAR. Nunca. Ni en Sueños, o tendrás pesadillas.
¿Cómo construyes la consulta, entonces? Pues es medio obvio: la creas haciendo que la fecha quede en el formato AAAA-MM-DD, como en mi ejemplo. Para eso cada lenguaje tiene sus propias funciones de formato de fechas y horas... PHP no es la excepción.
USA esas funciones.
Por su lado, MySQL puede devolverte una fecha en cualquier formato, ya que también tiene a su vez funciones de salida que lo pueden hacer. Pero no es buena idea usarlas en los WHERE, y convertir una fecha a cadena "DD/MM/AAAA" en el WHERE puede darte resultados erróneos en las consultas. No lo hagas.
__________________
¿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: as, llave, postgres, sobreescribir
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 12:50.