Сбросить столбец со значением numeri c, который представляет порядок при уничтожении строки - PullRequest
0 голосов
/ 07 августа 2020

У меня есть таблица пользователей, в которой есть столбец с именем order, который представляет порядок, в котором они будут выбраны.

Так, например, таблица может выглядеть так:

| id  | name   | order | 
|-----|--------|-------|
| 1   | John   |  2    |
| 2   | Mike   |  0    |
| 3   | Lisa   |  1    |

Итак, предположим, что теперь Лиза уничтожена, я бы хотел, чтобы в той же транзакции, в которой я уничтожаю Лизу, я могу обновить таблицу, чтобы порядок оставался согласованным, поэтому ожидаемый результат будет:

| id  | name   | order | 
|-----|--------|-------|
| 1   | John   |  1    |
| 2   | Mike   |  0    |

Или, если бы Майк был тем, кого нужно было удалить, ожидаемый результат был бы:

| id  | name   | order | 
|-----|--------|-------|
| 1   | John   |  1    |
| 3   | Lisa   |  0    |

Как я могу сделать это в PostgreSQL?

1 Ответ

1 голос
/ 07 августа 2020

Если вы просто удаляете одну строку, один из вариантов использует cte и предложение returning, чтобы затем запускать update

with del as (
    delete from mytable where name = 'Lisa'
    returning ord
)
update mytable 
set ord = ord - 1
from del d
where mytable.ord > d.ord

В качестве более общего подхода я бы действительно рекомендовал попробовать перенумеровать всю таблицу после каждого удаления. Это неэффективно и может быть утомительным для удаления нескольких строк.

Вместо этого вы можете построить представление поверх таблицы:

create view myview as
select id, name, row_number() over(order by ord) ord
from mytable 
...