1 added
1 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: postgresql, базы данных, таблицы, postgres, постгресс, полезные команды, поиск значений</p>
1
<p>Теги: postgresql, базы данных, таблицы, postgres, постгресс, полезные команды, поиск значений</p>
2
-
<p>При использовании последовательностей (sequence) в качестве первичного ключа (primary key) надо быть очень внимательным. Дело в том, что при назначении некоторые элементы последовательности случайно пропускаются, и в результате работы с таблицей базы данных некоторые записи удаляются. В принципе, эти зн��чения можно использовать снова, однако найти их будет сложно, особенно в больших таблицах. Что же, давайте поищем.</p>
2
+
<p>При использовании последовательностей (sequence) в качестве первичного ключа (primary key) надо быть очень внимательным. Дело в том, что при назначении некоторые элементы последовательности случайно пропускаются, и в результате работы с таблицей базы данных некоторые записи удаляются. В принципе, эти значения можно использовать снова, однако найти их будет сложно, особенно в больших таблицах. Что же, давайте поищем.</p>
3
<p>Существуют два варианта поиска, рассмотрим каждый из них.</p>
3
<p>Существуют два варианта поиска, рассмотрим каждый из них.</p>
4
<h3>Первый вариант</h3>
4
<h3>Первый вариант</h3>
5
<p>Чтобы найти начало нашего интервала с "потерянным" значением, выполним следующий запрос:</p>
5
<p>Чтобы найти начало нашего интервала с "потерянным" значением, выполним следующий запрос:</p>
6
SELECT customer_id + 1 FROM customers mo WHERE NOT EXISTS ( SELECT NULL FROM customers mi WHERE mi.customer_id = mo.customer_id + 1 ) ORDER BY customer_id;<p>В итоге мы получим следующие значения: 5, 9 и 11.</p>
6
SELECT customer_id + 1 FROM customers mo WHERE NOT EXISTS ( SELECT NULL FROM customers mi WHERE mi.customer_id = mo.customer_id + 1 ) ORDER BY customer_id;<p>В итоге мы получим следующие значения: 5, 9 и 11.</p>
7
<p>Однако бывает, что надо найти не только первое вхождение, но и все пропущенные. Тут подойдёт другой запрос, правда, стоит учитывать, что он является<strong>ресурсоёмким</strong>:</p>
7
<p>Однако бывает, что надо найти не только первое вхождение, но и все пропущенные. Тут подойдёт другой запрос, правда, стоит учитывать, что он является<strong>ресурсоёмким</strong>:</p>
8
WITH seq_max AS ( SELECT max(customer_id) FROM customers ), seq_min AS ( SELECT min(customer_id) FROM customers ) SELECT * FROM generate_series((SELECT min FROM seq_min),(SELECT max FROM seq_max)) EXCEPT SELECT customer_id FROM customers;<p>В итоге мы получим 5, 9 и 6.</p>
8
WITH seq_max AS ( SELECT max(customer_id) FROM customers ), seq_min AS ( SELECT min(customer_id) FROM customers ) SELECT * FROM generate_series((SELECT min FROM seq_min),(SELECT max FROM seq_max)) EXCEPT SELECT customer_id FROM customers;<p>В итоге мы получим 5, 9 и 6.</p>
9
<h3>Второй вариант</h3>
9
<h3>Второй вариант</h3>
10
<p>В этом случае мы получаем имя последовательности, которая связана с customer_id:</p>
10
<p>В этом случае мы получаем имя последовательности, которая связана с customer_id:</p>
11
SELECT pg_get_serial_sequence('customers', 'customer_id');<p>И, таким образом, находим все пропущенные идентификаторы:</p>
11
SELECT pg_get_serial_sequence('customers', 'customer_id');<p>И, таким образом, находим все пропущенные идентификаторы:</p>
12
WITH sequence_info AS ( SELECT start_value, last_value FROM "SchemaName"."SequenceName" ) SELECT generate_series ((sequence_info.start_value), (sequence_info.last_value)) FROM sequence_info EXCEPT SELECT customer_id FROM customers;<p>Вот и всё, возможно, вам также будут интересны следующие статьи: - "<a>Работа с конфигурацией в PostgreSQL</a>"; - "<a>Безопасное изменение типа поля в PostgreSQL</a>"; - "<a>Полезные команды в PostgreSQL</a>".</p>
12
WITH sequence_info AS ( SELECT start_value, last_value FROM "SchemaName"."SequenceName" ) SELECT generate_series ((sequence_info.start_value), (sequence_info.last_value)) FROM sequence_info EXCEPT SELECT customer_id FROM customers;<p>Вот и всё, возможно, вам также будут интересны следующие статьи: - "<a>Работа с конфигурацией в PostgreSQL</a>"; - "<a>Безопасное изменение типа поля в PostgreSQL</a>"; - "<a>Полезные команды в PostgreSQL</a>".</p>
13
<p><em>По материалам "<a>15 Advanced PostgreSQL Commands with Examples</a>" и "<a>10 Most Useful PostgreSQL Commands with Examples</a>".</em></p>
13
<p><em>По материалам "<a>15 Advanced PostgreSQL Commands with Examples</a>" и "<a>10 Most Useful PostgreSQL Commands with Examples</a>".</em></p>
14
14