perdon, por favor corregir el is null por is not null
>________________________________ > De: Alejandro Carrillo <faster...@yahoo.es> >Para: Lazáro Rubén García Martínez <lgarc...@vnz.uci.cu>; Jorge Toro ><jolt...@gmail.com>; Foro Postgres <pgsql-es-ayuda@postgresql.org> >Enviado: Lunes 9 de julio de 2012 10:34 >Asunto: Re: [pgsql-es-ayuda] Ayuda con inquietud > > >Creo que lo mejor es hacer un índice único en la tabla GPS (llave primaria), >un campo donde esté la última posición del GPS y otro índice en la llave >foránea de GPS en la tabla positions. Y crear una function asi: > > >CREATE OR REPLACE FUNCTION public.fn_guardar_posicion ( > gps_id_ integer, > posicion_ varchar, > velocidad_ real, > altura_ real, > fecha_ timestamp, > grados_ real, > satelites_ integer >) >RETURNS integer AS >$body$ >DECLARE > retorno INTEGER; >BEGIN > > INSERT INTO positions > ( > gps_id, > posicion, > velocidad, > altura, > fecha, > grados, > satelites > ) > VALUES ( > gps_id_, > posicion_, > velocidad_, > altura_, > fecha_, > grados_, > satelites_ > )RETURNING id INTO retorno; > if (id is null) then > UPDATE gps > SET > posicion = posicion_, > WHERE id = gps_id_; > > end if; >; > > RETURN retorno; >END; >$body$ >LANGUAGE 'plpgsql'; > > >Así no necesitas tener más tablas adicionales. No olvidar hacer vacuum full a >las tablas periódicamente en horario donde haya pocas transacciones. > > > > >>________________________________ >> De: Lazáro Rubén García Martínez <lgarc...@vnz.uci.cu> >>Para: Jorge Toro <jolt...@gmail.com>; Foro Postgres >><pgsql-es-ayuda@postgresql.org> >>Enviado: Lunes 9 de julio de 2012 10:21 >>Asunto: RE: [pgsql-es-ayuda] Ayuda con inquietud >> >>Entonces podrias tener dos tablas positions, una que se llame hist_positions >>por ejemplo, y la otra positions, sobre positions almacenas la última >>ubicación de los gps y sobre hist_positions el historial de posiciones de los >>gps, para almacenar las posiciones de los gps utililizas una función, y para >>llevar el historial de los gps, puedes utilizar un trigger sobre positions. >>Acá te dejo el código de todo, solo falta la referencia de la clave foránea. >>Espero que te sirva. >> >>PD: Pudieran existir otras soluciones. >> >>--Crear la tabla positions >>CREATE TABLE public.positions ( >> id SERIAL, >> gps_id INTEGER, >> posicion VARCHAR, >> velocidad REAL, >> altura REAL, >> fecha TIMESTAMP WITHOUT TIME ZONE, >> grados REAL, >> satelites INTEGER, >> CONSTRAINT positions_pkey PRIMARY KEY(id) >>) WITHOUT OIDS; >> >>--Crear la tabla hist_positions >>CREATE TABLE public.hist_positions ( >> id SERIAL, >> gps_id INTEGER, >> posicion VARCHAR, >> velocidad REAL, >> altura REAL, >> fecha TIMESTAMP WITHOUT TIME ZONE, >> grados REAL, >> satelites INTEGER, >> CONSTRAINT hist_positions_pkey PRIMARY KEY(id) >>) WITHOUT OIDS; >> >>--Función para guardar en positions >>CREATE OR REPLACE FUNCTION public.fun_guardar_posicion ( >> gps_id_ integer, >> posicion_ varchar, >> velocidad_ real, >> altura_ real, >> fecha_ timestamp, >> grados_ real, >> satelites_ integer >>) >>RETURNS integer AS >>$body$ >>DECLARE >> retorno INTEGER; >>BEGIN >> UPDATE positions >> SET >> posicion = posicion_, >> velocidad = velocidad_, >> altura = altura_, >> fecha = fecha_, >> grados = grados_, >> satelites = satelites_ >> WHERE gps_id = gps_id_ >> RETURNING id INTO retorno; >> >> IF (retorno IS NULL) THEN >> INSERT INTO positions >> ( >> gps_id, >> posicion, >> velocidad, >> altura, >> fecha, >> grados, >> satelites >> ) >> VALUES ( >> gps_id_, >> posicion_, >> velocidad_, >> altura_, >> fecha_, >> grados_, >> satelites_ >> )RETURNING id INTO retorno; >> END IF; >> >> RETURN retorno; >>END; >>$body$ >>LANGUAGE 'plpgsql'; >> >>--Función ejecutada por el trigger para guardar en el historial de positions >>CREATE OR REPLACE FUNCTION public.fun_trg_hist_positions ( >>) >>RETURNS trigger AS >>$body$ >>DECLARE >>BEGIN >> INSERT INTO hist_positions >> ( >> gps_id, >> posicion, >> velocidad, >> altura, >> fecha, >> grados, >> satelites >> ) >> VALUES ( >> NEW.gps_id, >> NEW.posicion, >> NEW.velocidad, >> NEW.altura, >> NEW.fecha, >> NEW.grados, >> NEW.satelites >> ); >> >> RETURN NULL; >>END; >>$body$ >>LANGUAGE 'plpgsql'; >> >>--Trigger utilizado >>CREATE TRIGGER trg_hist_positions AFTER INSERT OR UPDATE >>ON public.positions FOR EACH ROW >>EXECUTE PROCEDURE public.fun_trg_hist_positions(); >> >>Saludos a todos. >>________________________________________ >>From: pgsql-es-ayuda-ow...@postgresql.org >>[pgsql-es-ayuda-ow...@postgresql.org] On Behalf Of Jorge Toro >>[jolt...@gmail.com] >>Sent: Monday, July 09, 2012 9:43 AM >>To: Foro Postgres >>Subject: Re: [pgsql-es-ayuda] Ayuda con inquietud >> >>Hola Lazáro, gracias por responder. >> >>Sí gps.id<http://gps.id> es la referencia a una tabla "gps" que se usa para >>registrar cada uno de los GPS que se registran para ser aceptados por el >>servidor. >>Esta tabla "gps" tiene datos como: id, name, type, active. de cada uno de los >>GPS. Y la tabla "position" se encarga de almacenar los reportes (históricos) >>hechos por cada GPS. >> >>Y lo que quiero lograr es, tener a la mano siempre que consulte un >>dispositivo, toda la última información de dicho dispositivo que se encuentre >>en la tabla "position". >> >>Pero no quiero realizar una consulta directa a la tabla "position" porque >>son alrededor de 1000 GPS reportando cada minuto y esta tabla "position" tenderá a ser demasiado grande con el pasar del tiempo. >> >> >>Por tu ayuda muchas gracias, >> >> >>Jorge Alonso Toro >>Ing. Teleinformático. >> >>http://jolthgs.wordpress.com/ >>www.devmicrosystem.com<http://www.devmicrosystem.com> >>-------------------------------------------------------------- >>Powered By Debian. >>Developer Bullix GNU/Linux. >>-------------------------------------------------------------- >>-----BEGIN PGP SIGNATURE----- >>Version: GnuPG v1.4.6 (GNU/Linux) >> >>iD8DBQBIWWH6q7mzdgTzI5ARAkX5AJ9TR6hL2ocLMOUDRfhts8DlVl+jpwCeNw5x >>p4+4FNUHPDUx1lU9F8WSKCA= >>=zRhQ >>-----END PGP SIGNATURE----- >>Este correo esta protegido bajo los términos de la Licencia >>Atribución-Compartir Obras Derivadas Igual a 2.5 Colombia de Creative >>Commons. Observé la licencia visitando este sitio http://creativecommons.org/licenses/by-sa/2.5/co/. >> >> >>El 9 de julio de 2012 09:17, Lazáro Rubén García Martínez >><lgarc...@vnz.uci.cu<mailto:lgarc...@vnz.uci.cu>> escribió: >>La columna gps_id es única >> >> >>________________________________ >>Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE >>ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU! >>http://www.antiterroristas.cu >>http://justiciaparaloscinco.wordpress.com >> >>Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE >>ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU! >>http://www.antiterroristas.cu >>http://justiciaparaloscinco.wordpress.com >>- >>Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) >>Para cambiar tu suscripción: >>http://www.postgresql.org/mailpref/pgsql-es-ayuda >> >> >> > >