Re: Get last generated serial sequence and set it up when explicit value is used

Поиск
Список
Период
Сортировка
От Sebastien FLAESCH
Тема Re: Get last generated serial sequence and set it up when explicit value is used
Дата
Msg-id 00531c42-840c-3dab-e149-4d1cb2b43bf5@4js.com
обсуждение исходный текст
Ответ на Re: Get last generated serial sequence and set it up when explicit value is used  (Sebastien FLAESCH <sf@4js.com>)
Список pgsql-sql
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
> 




В списке pgsql-sql по дате отправления:

Предыдущее
От: Sebastien FLAESCH
Дата:
Сообщение: Re: Get last generated serial sequence and set it up when explicit value is used
Следующее
От: "Voillequin, Jean-Marc"
Дата:
Сообщение: CTE materialized/not materialized