add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
Help with an interesting Postgres question: Why isn't an Index Only Scan used on a partition accessed via the parent table?.
select version();
version
PostgreSQL 13.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.4.1 20200928 (Red Hat 8.4.1-1), 64-bit
-- setup
create table test(tid integer generated always as identity
primary key
, order_view integer not null
constraint test_order_view_uk
unique
, name text
);

insert into test ( order_view, name)
select n, 'Initial-' || to_char(n,'00')
from generate_series ( 1, 7) gs(n);

select * from test;
7 rows affected
tid order_view name
1 1 Initial- 01
2 2 Initial- 02
3 3 Initial- 03
4 4 Initial- 04
5 5 Initial- 05
6 6 Initial- 06
7 7 Initial- 07
alter table test
drop constraint if exists test_order_view_uk;
alter table test
add constraint test_order_view_uk
unique(order_view)
deferrable initially deferred;
-- insert a new order_view 4
-- hard code demo values as fiddle in not interactive
with updt as
( update test
set order_view = order_view+1
where order_view >= 4
)
insert into test (order_view, name)
values (4, 'insert new 4');
select * from test;
1 rows affected
tid order_view name
1 1 Initial- 01
2 2 Initial- 02
3 3 Initial- 03
8 4 insert new 4
4 5 Initial- 04
5 6 Initial- 05
6 7 Initial- 06
7 8 Initial- 07
-- build Procedure to handle
create or replace
procedure insert_reorder_test(
name_in test.name%type
, order_view_in test.order_view%type default null
)
language sql
as $$
with new_order_view(nov) as
( select coalesce( order_view_in
, (select 1+coalesce(max(order_view),0)
from test
)
)
)
, updt as
( update test
set order_view = order_view+1
where order_view >= (select nov from new_order_view)
)
insert into test ( name, order_view)
select name_in
, nov
from new_order_view;
$$;
-- use function
do $$
begin
call insert_reorder_test('Create new #3',3);
call insert_reorder_test('Add to end of list',null);
end;
$$;

select * from test;
tid order_view name
1 1 Initial- 01
2 2 Initial- 02
9 3 Create new #3
3 4 Initial- 03
8 5 insert new 4
4 6 Initial- 04
5 7 Initial- 05
6 8 Initial- 06
7 9 Initial- 07
10 10 Add to end of list