Sql

Postgresql nextval: PostgreSQL : Документация: 9.6: CREATE SEQUENCE : Компания Postgres Professional

Удаление последовательности (sequences) в PostgreSQL

База данных PostgreSQL предлагает различные функции, и одна из них — PostgreSQL Sequence. Последовательность PostgreSQL — это объект, связанный с базой данных, который используется для создания последовательности значений, начиная с определенного значения. Обычно он принимает начальную точку, значение приращения, минимальное значение, которое оно может иметь, и максимальное значение, к которому оно может приблизиться. Таким образом, мы решили рассказать вам об использовании последовательности PostgreSQL в базе данных и о том, как различными способами удалить уже существующую последовательность. Итак, приступим.

Содержание

  1. Удалить последовательность через pgAdmin
  2. Удаление последовательности через оболочку PostgreSQL
  3. Заключение

Удалить последовательность через pgAdmin

Давайте посмотрим, как создать последовательность и удалить ее с помощью пользовательского интерфейса pgAdmin базы данных PostgreSQL. Для этого нам нужно запустить pgAdmin из панели поиска нашей Windows 10. Добавьте пароль для сервера и базы данных, например, aqsayasin, чтобы сделать pgAdmin пригодным для использования. Теперь pgAdmin запущен в нашей системе. Изучите имеющиеся у вас базы данных. Мы будем работать в базе данных «aqsayasin», как показано на рисунке.

В схемах вы должны изучить параметр «Последовательность», как показано на рисунке. Если в вашей базе данных есть какая-либо последовательность, она покажет список. Поскольку сейчас в нашей базе данных нет последовательности, поэтому она пуста.

Давайте создадим новую последовательность в нашей базе данных «aqsayasin» с помощью pgAdmin. Щелкните правой кнопкой мыши параметр Sequence, чтобы изучить его. Появится показанный ниже диалог. Наведите указатель мыши на опцию «Создать», чтобы развернуть ее. Нажмите на опцию «Последовательность», чтобы быстро создать новую последовательность.

Показанный ниже экран будет открыт в вашем приложении pgAdmin для создания последовательности. В текстовом поле перед опцией «Имя» напишите имя последовательности, которую вы хотите создать. Мы назвали его «тест». Вы должны выбрать владельца вашей последовательности, т.е. имя пользователя/базу данных. В нашем случае это «аксаясин». Перейдите к разделу «Определение».

Здесь нужно создать основные настройки нашей последовательности. Вы должны установить каждое значение для каждой опции. Например, мы хотим увеличить значение последовательности на 5, а начало последовательности установлено равным 5. Это означает, что где бы эта последовательность ни собиралась использоваться, она всегда будет начинаться с 5. При каждом вызове последовательности он будет увеличен на 5. Мы должны установить минимальное и максимальное значение для создаваемой последовательности, чтобы она не превышала оба конца. В разделе SQL вы можете увидеть запрос на создание последовательности в PostgreSQL. Нажмите на кнопку «Сохранить», чтобы окончательно завершить создание последовательности «тест».

Обновите параметр «Последовательности над таблицами» в базе данных «aqsayasin». Вы увидите, что только что созданная «тестовая» последовательность указана в нем и готова к использованию.

Чтобы увидеть самое первое значение последовательности «тест», вы можете использовать команду SELECT в области редактора запросов, как показано ниже, за которой следует имя последовательности. Первое значение последовательности равно 5 согласно выходным данным.

Чтобы увеличить первое значение последовательности «test» на 5, вам нужно вызвать последовательность с помощью функции «nextval» с помощью инструкции SELECT, как показано. Отображается увеличенное значение 10.

Использование функции nextval() будет каждый раз увеличивать значение последовательности. Мы вызвали его 5 раз и получили результат 35.

При вызове последовательности «тест» еще 5 раз с помощью функции nextval() отображается значение «60», которое также является максимальным значением для нашей последовательности. После этого он не будет увеличиваться.

Использование функции nextval() в запросе SELECT снова приводит нас к ошибке, объясняющей, что тестовая последовательность достигла своего максимума.

Чтобы удалить или отбросить последовательность «тест», вам нужно щелкнуть по ней правой кнопкой мыши, чтобы увидеть доступные варианты. В диалоговом окне вы найдете опции «Удалить/удалить» и «Удалить каскад». Оба могут быть использованы по-разному. Параметр «Удалить/удалить» удалит только последовательность, а параметр «Каскадное удаление» также удалит объекты, которые от нее зависят.

При использовании опции «Удалить / удалить» мы получим диалоговое окно ниже на нашем экране. Нажмите «да», чтобы продолжить удаление этой «тестовой» последовательности.

При использовании опции «Каскадное удаление» появится диалоговое окно ниже, чтобы убедиться, что вы хотите удалить объекты, связанные с последовательностью, вместе с конкретной последовательностью. Нажмите на кнопку «Да», чтобы продолжить.

Удаление последовательности через оболочку PostgreSQL

Чтобы удалить последовательность, она должна быть в вашей текущей базе данных. Войдите из оболочки PostgreSQL, добавив имя вашего локального хоста, имя базы данных, номер порта, имя пользователя и пароль. В запросе область использует команду CREATE SEQUENCE для создания последовательности с именем «Num». Для простой иллюстрации мы добавили только значение приращения и начальное значение для этой последовательности.

Чтобы удалить последовательность «Число», используйте команду DROP SEQUENCE. Вы больше не найдете свою последовательность в базе данных.

Давайте посмотрим на более широкую картину. Мы начнем этот пример с создания новой таблицы «Макияж» с помощью команды CREATE TABLE. Всего в таблице 3 столбца. Запрос SELECT показывает, что таблица пуста.

Вам нужно создать последовательность «тест» с помощью команды CREATE SEQUENCE. Мы добавляли начальное значение, значение приращения, минимальное значение, максимальное значение и таблицу владельцев этой последовательности, т. е. Makeup. Таким образом, таблица «Макияж» зависит от «тестовой» последовательности.

Подставим значения в таблицу Makeup. В разделе VALUES команды INSERT INTO мы использовали функцию nextval(), чтобы использовать тестовую последовательность для добавления значений в таблицу. Всего было добавлено 5 записей.

Запрос SELECT может отображать недавно добавленные данные таблицы Makeup. Вы можете видеть, что столбец «цена» содержит значения, начинающиеся с 1000 и увеличивающиеся на 1000 в каждой строке с использованием последовательности «тест».

Добавьте еще 5 записей таким же образом, например, с помощью команды INSERT INTO и функции nextval().

Всего с помощью инструкции SELECT было найдено 10 записей. Мы знаем, что максимальное значение, определенное для «тестовой» последовательности, равно «10000», и оно уже достигнуто в 10-й строке столбца цены. Это означает, что мы не сможем добавить больше записей.

При использовании команды INSERT INTO для добавления дополнительных записей в таблицу Makeup мы обнаружили ошибку, как показано ниже. Он показывает, что последовательность уже достигла своего максимального значения, т. е. 10 000.

Чтобы удалить последовательность «тест», нам нужно использовать команду DROP SEQUENCE с командой RESTRICT.

Когда вы снова попытаетесь добавить данные в таблицу «макияжа», используя тестовую последовательность в функции nextval(), она не позволит вам, потому что последовательность «тест» исчезла.

Заключение

В этой статье демонстрируется использование последовательности PostgreSQL и способы ее удаления из базы данных PostgreSQL при работе в Windows 10. Мы попытались создать и удалить последовательность с помощью графического интерфейса PostgreSQL, т. е. с помощью pgAdmin и оболочки PostgreSQL по отдельности. В примерах четко показаны различные методы удаления/удаления последовательности отдельно и вместе со связанными с ней объектами.

postgresql — Postgres: получить nextval последовательно без фактического увеличения последовательности?

спросил

Изменено 1 год, 6 месяцев назад

Просмотрено 27 тысяч раз

Похоже, что select nextval('table_name') действительно увеличивает значение.

Моя цель состоит в том, чтобы «предсказать» значение nextval для всех таблиц в базе данных без фактического увеличения. Это должна быть операция только для чтения.

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

Как бы вы справились с этим и достигли цели?

  • PostgreSQL
  • последовательность

2

Я бы предположил, что SELECT currval('seq_name') + 1 или SELECT last_value + 1 FROM seq_name будет ответом, но это только в том случае, если вы увеличиваете на 1 , или вы знаете, что приращение отключено -рука.

Если вы не увеличиваете на 1 и не знаете приращение, попробуйте следующее:

 SELECT currval('seq_name') + i. inc
  FROM (ВЫБЕРИТЕ seqincrement AS inc
          ИЗ pg_sequence
         ГДЕ seqrelid = 'seq_name'::regclass::oid) AS i;
 

или

 ВЫБРАТЬ last_value + i.inc
  ОТ seq_name,
      (ВЫБЕРИТЕ seqincrement AS inc
         ИЗ pg_sequence
        ГДЕ seqrelid = 'seq_name'::regclass::oid) AS i;
 

0

Основываясь на предыдущих ответах, я понял, что это не удается для первого добавленного значения: запрос возвращает 2 вместо 1, когда нет добавленных значений. Вот мое решение:

 ВЫБЕРИТЕ (СЛУЧАЙ, КОГДА is_вызывается, ТОГДА last_value + i.inc
        ELSE последнее_значение END ) КАК следующее значение
  ИЗ моего сериала,
      (ВЫБЕРИТЕ seqincrement AS inc
       ИЗ pg_sequence
       ГДЕ seqrelid = 'myserial'::regclass::oid) AS i;
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie

.

postgresql — последний идентификатор последовательности Postgres и незафиксированные записи

Задавать вопрос

спросил

Изменено 1 год, 9 месяцев назад

Просмотрено 529 раз

Надеясь, что кто-то может прояснить раздел этой статьи «масштабируемое инкрементное агрегирование данных» и соответствующий вопрос.

Предположим, Postgres 10 и выше.

В Postgres 10 вы можете использовать функцию pg_sequence_last_value для проверки последнего выданного порядкового номера. Однако было бы небезопасно просто агрегировать все события вплоть до самого последнего значения последовательности. В таблице событий все еще могут быть незавершенные операции записи, которым были назначены более низкие значения последовательности, но которые еще не видны при выполнении агрегации.

Существуют ли альтернативы pg_sequence_last_value, гарантирующие правильный идентификатор SEQ?


Есть ли в таблице (назовем ее событиями) с идентификатором BIGSERIAL предпочтительный способ получения последнего идентификатора SEQ для целей агрегирования? Это нормально, если есть ожидающие вставки в другую транзакцию (они будут иметь более высокие идентификаторы последовательности) и будут выбраны при последующих запусках.

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

Следующие три метода гарантированно возвращают последний идентификатор SEQ для зафиксированных и избежать ловушки, упомянутой в статье о pg_sequence_last_value?

Можно ли предложить другие методы?

 ВЫБЕРИТЕ макс. (id) ИЗ событий;
ВЫБЕРИТЕ last_value ИЗ pg_sequences WHERE sequencename='events_id_seq';
ВЫБЕРИТЕ id ИЗ событий ORDER BY id DESC LIMIT 1;
 

Предположим, зафиксировано чтение уровень изоляции

  • postgresql
  • последовательность

0

select max(id) — самый надежный способ.

Это также довольно быстро, если у вас есть индекс B-дерева на id (производительность практически не зависит от размера таблицы).

0

Один из способов сделать это — связать обновления с идентификатором транзакции. В этом случае все обновления ниже xmin могут считаться зафиксированными или откатываться. См. документацию:

txid_current() bigint получить идентификатор текущей транзакции, назначив новый если текущая транзакция не имеет ни одного

txid_current_snapshot() txid_snapshot получить текущий снимок

txid_snapshot_xmin(txid_snapshot) bigint получить xmin моментального снимка

xmin Идентификатор самой ранней транзакции (txid), которая все еще активна.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *