如何指定postgresql序列的值列表

时间:2011-10-17 09:39:28

标签: postgresql concurrency sequences

我有一个整数值列表X,我希望我的表Y的主键来自整数值列表。我想知道是否可以使用序列来完成。换句话说:有没有办法告诉PostgreSQL序列使用这个列表X为我的表Y生成主键?

执行此操作的一种方法是使用包含列表X中最后使用的整数的索引的序列,在序列上调用setval(),获取下一个值并尝试插入它进入我的表Y。如果是并发请求,则会出现错误,在这种情况下,我需要尝试使用列表X中的下一个值。我想知道有什么其他(更好的)方法来实现我打算做的事情。

3 个答案:

答案 0 :(得分:2)

可以像这样工作:

-- 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() 如果要确保自定义ID是唯一的,请在priv_id(id)上创建唯一索引。

答案 1 :(得分:0)

generate_series可用于生成每个序列生成的所有数字的列表:

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

注意:这假设序列(此处为my_sequence)从1开始并递增1。要更改这些假设,请适当更改参数。

答案 2 :(得分:0)

提供自己的有效数字集的最常用方法是将它们存储在表中,并设置对它的外键引用。

这解决了使用您自己的列表的问题,但它没有解决从列表中获取下一个数字的问题。要做到这一点,你需要编写自己的函数。 (你不能强迫PostgreSQL序列在你的桌面上操作而不是使用它的内部。)但是,这并不是特别难做。

经常被忽视的另一种选择 - 也许有充分的理由 - 就是编写自己的序列。 PostgreSQL是开源的;您可以根据现有的序列代码编写自己的音序器。编译它,测试它,然后你就参加了比赛。 (但我不建议这样做。)