Received: from localhost (unknown [200.46.204.187]) by postgresql.org (Postfix) with ESMTP id E2A542E3FD8 for ; Wed, 16 Jan 2008 09:41:45 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.187]) (amavisd-maia, port 10024) with ESMTP id 71983-01-5 for ; Wed, 16 Jan 2008 09:41:24 -0400 (AST) Received: from pyxis.powervt.com.ar (host3.powervt.com.ar [200.43.63.66]) by postgresql.org (Postfix) with ESMTP id 405422E45CE for ; Wed, 16 Jan 2008 09:31:13 -0400 (AST) Received: from pcfhevia ([201.216.249.98]) by pyxis.powervt.com.ar (IPGroup Mail Server) with ESMTP id 1OT48953; Wed, 16 Jan 2008 10:31:10 -0200 From: "Fernando Hevia" To: "'Franklin Haut'" , Subject: Re: Update PK Violation Date: Wed, 16 Jan 2008 11:32:00 -0200 Organization: IP-TEL Message-ID: <001201c85844$2c8bf7d0$8f01010a@iptel.com.ar> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 11 Thread-Index: AchXqZrnSdycC50FSMCgSICXcG1orQAmbPgg X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198 In-Reply-To: <478D1FB5.2070003@gmail.com> X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200801/139 X-Sequence-Number: 29992 > Franklin Haut wrote: > > Hi all, > > i have a problem with one update sentence sql. > > example to produce: > > create table temp (num integer primary key, name varchar(20)); > > insert into temp values (1, 'THE'); > insert into temp values (2, 'BOOK'); > insert into temp values (3, 'IS'); > insert into temp values (4, 'ON'); > insert into temp values (5, 'THE'); > insert into temp values (6, 'RED'); > insert into temp values (7, 'TABLE'); > Couldn't figure out how to do it in one sentence, still it can be done with a function: CREATE OR REPLACE FUNCTION insert_value(p_num integer, p_name varchar(20)) RETURNS VOID AS $$ declare v_num integer; BEGIN FOR v_num in SELECT num FROM temp WHERE num >= p_num ORDER BY num DESC LOOP UPDATE temp SET num = num + 1 WHERE num = v_num; END LOOP; INSERT INTO temp VALUES (p_num, p_name); END; $$ LANGUAGE 'plpgsql' VOLATILE; To run it: sistema=# select insert_value(4, 'NOT'); insert_value -------------- (1 row) sistema=# select * from temp order by num; num | name -----+------- 1 | THE 2 | BOOK 3 | IS 4 | NOT 5 | ON 6 | THE 7 | RED 8 | TABLE (8 rows) Regards, Fernando.