Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kht2l-0005j4-Iz for pgsql-sql@arkaria.postgresql.org; Wed, 25 Nov 2020 11:33:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kht2k-0004VI-E3 for pgsql-sql@arkaria.postgresql.org; Wed, 25 Nov 2020 11:33:02 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kht2k-0004VB-7m for pgsql-sql@lists.postgresql.org; Wed, 25 Nov 2020 11:33:02 +0000 Received: from mail150.strasbourg.4js.com ([77.159.205.150]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kht2i-0005mk-2R for pgsql-sql@lists.postgresql.org; Wed, 25 Nov 2020 11:33:01 +0000 Received: from [10.6.0.108] ([10.6.0.108]) (authenticated bits=0) by mail150.strasbourg.4js.com (8.14.4/8.14.4/Debian-4+deb7u1) with ESMTP id 0APBWvqq030119 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NOT) for ; Wed, 25 Nov 2020 12:32:58 +0100 Subject: Re: Get last generated serial sequence and set it up when explicit value is used From: Sebastien FLAESCH To: pgsql-sql@lists.postgresql.org References: Organization: Four Js Development Tools Message-ID: <00531c42-840c-3dab-e149-4d1cb2b43bf5@4js.com> Date: Wed, 25 Nov 2020 12:32:57 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Virus-Scanned: clamav-milter 0.99.4 at mail150 X-Virus-Status: Clean X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.6.2 (mail150.strasbourg.4js.com [10.10.0.1]); Wed, 25 Nov 2020 12:32:58 +0100 (CET) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk Better use >= in pkey >= (select last_value ... ) : insert into mytab1 (name) values ('aaa') returning pkey, (select case when pkey >= (select last_value from mytab1_pkey_seq) then setval('mytab1_pkey_seq',pkey,true) else 0 end ); Seb On 11/21/20 10:26 AM, Sebastien FLAESCH wrote: > Hello everyone! > > I believe I have a solution using a single SQL command. > > Check this out... do you see any potential issues? > > Any simpler way or more efficient code? > > Note the insert with value 50, lower than previously inserted values, otherwise, > the returning clause would just need to be > >         returning pkey, setval('mytab1_pkey_seq',pkey,true) > > Note also that I want to return the pkey to use the generated serial in the > program code... > > > ===== > > create table mytab1 ( pkey serial not null primary key, name varchar(50) ); > > insert into mytab1 (name)      values ('aaa') >     returning pkey, (select case when pkey > (select last_value from mytab1_pkey_seq) >                                  then setval('mytab1_pkey_seq',pkey,true) >                                  else 0 >                             end ); > > insert into mytab1 (pkey,name) values (100,'bbb') >     returning pkey, (select case when pkey > (select last_value from mytab1_pkey_seq) >                                  then setval('mytab1_pkey_seq',pkey,true) >                                  else 0 >                             end ); > > insert into mytab1 (name)      values ('ccc') >     returning pkey, (select case when pkey > (select last_value from mytab1_pkey_seq) >                                  then setval('mytab1_pkey_seq',pkey,true) >                                  else 0 >                             end ); > > insert into mytab1 (pkey,name) values (50,'ddd') >     returning pkey, (select case when pkey > (select last_value from mytab1_pkey_seq) >                                  then setval('mytab1_pkey_seq',pkey,true) >                                  else 0 >                             end ); > > insert into mytab1 (name)      values ('eee') >     returning pkey, (select case when pkey > (select last_value from mytab1_pkey_seq) >                                  then setval('mytab1_pkey_seq',pkey,true) >                                  else 0 >                             end ); > > select * from mytab1 order by name; > > ===== > > SELECT output: > >  pkey | name > ------+------ >     1 | aaa >   100 | bbb >   101 | ccc >    50 | ddd >   102 | eee > (5 rows) > > > > > PostgreSQL rocks! > > Seb >