Последовательность обновления первичного ключа в postgres для таблицы с большим количеством удалений - PullRequest
1 голос
/ 30 мая 2020

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

DROP SEQUENCE IF EXISTS market_orders_seq
CREATE SEQUENCE market_orders_seq CACHE 1
CREATE TABLE market_orders (id int NOT NULL DEFAULT nextval('market_orders_seq') PRIMARY KEY, typ varchar(5), tag varchar(30), owner_id int, owner_tag varchar(5), amount int, price int, market_id int)
ALTER SEQUENCE market_orders_seq OWNED BY market_orders.id

, но, если я правильно понимаю, последовательности монотонны и не могут go отключиться, когда я удаляю некоторые строки, поэтому я столкнулся с проблемой того, что идентификаторы надувается довольно быстро. Как решить эту проблему? Я хотел бы использовать первый неиспользованный идентификатор для своих вставок, но не знаю, как это сделать.

1 Ответ

2 голосов
/ 30 мая 2020

Хотя это технически возможно, я бы не рекомендовал идти этим путем.

Во-первых, целочисленное значение может хранить значения до 2 миллиардов, которые вы, вероятно, не попадете - и вы все равно можете переключиться на bigint, которое может достигать примерно 1^19.

Кроме того, для определения пробелов требуется сканирование таблицы для каждой вставки, что неэффективно (чем больше таблица, тем менее эффективна).

insert into market_orders(id, typ, ...)
select
    min(id) + 1,
    'foo',
    ...
from market_orders mo
where not exists(select 1 from market_orders mo1 where mo1.id = mo + 1)

Примечание: вы должны использовать [big]serial тип данных , поэтому вам не нужно обрабатывать последовательность самостоятельно.

...