HTML Diff
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