Как указать список значений для последовательности postgresql - PullRequest
1 голос
/ 17 октября 2011

У меня есть список целочисленных значений X, и я хочу, чтобы первичный ключ для моей таблицы Y исходил из этого списка целочисленных значений.Мне было интересно, если это можно сделать с помощью последовательностей.Другими словами: есть ли способ указать последовательности PostgreSQL использовать этот список X для генерации первичных ключей для моей таблицы Y?

Один из способов сделать это - использовать последовательность, содержащую индекс последнего использованного целого числа из списка X, вызвать setval() в последовательности, получить следующее значение и попытаться вставить его.в мой стол Y.В случае одновременных запросов возникнет ошибка, и в этом случае мне нужно будет попробовать следующее значение из списка X.Я хотел бы знать, какие есть другие (лучшие) способы добиться того, что я намерен сделать.

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Может работать так:

-- DROP SCHEMA x CASCADE;
CREATE SCHEMA x;
CREATE TABLE x.priv_id(seq_id int primary key, id int);

INSERT INTO x.priv_id
SELECT generate_series(1,100,1), (random() * 1000)::int;

CREATE SEQUENCE x.priv_seq;

SELECT id
FROM   x.priv_id
WHERE  seq_id = (SELECT nextval('x.priv_seq'));

Основные баллы:

1) Создать таблицу поиска с двумя числами
- seq_id считает от 1 до вашего первичного ключа.
- id - ваши числа в последовательности (здесь я подставил случайные числа).
2) Создайте вспомогательную последовательность.
3) Получите ваши номера с помощью SELECT, как указано выше.
Вы должны отменить выбор, иначе все значения будут возвращены сразу.

Это решение обеспечивает всю безопасность, которую nextval () может предложить для параллелизма.
Создайте уникальный индекс для priv_id (id), если хотите убедиться, что ваши пользовательские идентификаторы уникальны.

0 голосов
/ 17 октября 2011

Самый общий способ предоставить свой собственный набор допустимых чисел - это сохранить их в таблице и установить для нее ссылку на внешний ключ.

Это решает проблему использования вашего собственного списка, но не решает проблему извлечения следующего числа из списка.Для этого вам нужно написать свою собственную функцию.(Вы не можете заставить последовательность PostgreSQL работать на вашем столе, вместо того, чтобы использовать ее внутренние компоненты.) Однако сделать это не особенно сложно.

Другая альтернатива, которую часто упускают из виду - возможно, по уважительной причине -писать свою собственную последовательность.PostgreSQL является открытым исходным кодом;Вы можете написать свой собственный секвенсор на основе существующего кода последовательности.Скомпилируйте, протестируйте, и вы отправитесь в гонки.(Хотя я не рекомендую это делать.)

0 голосов
/ 17 октября 2011

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

select * 
from generate_series(1, (select last_value from my_sequence), 1) as x

Примечание. Предполагается, что последовательность (здесь my_sequence) начинается с 1 и увеличивается на 1. Чтобы изменить эти предположения, измените параметры соответствующим образом.

...