我有一个整数值列表X
,我希望我的表Y
的主键来自整数值列表。我想知道是否可以使用序列来完成。换句话说:有没有办法告诉PostgreSQL序列使用这个列表X
为我的表Y
生成主键?
执行此操作的一种方法是使用包含列表X
中最后使用的整数的索引的序列,在序列上调用setval()
,获取下一个值并尝试插入它进入我的表Y
。如果是并发请求,则会出现错误,在这种情况下,我需要尝试使用列表X
中的下一个值。我想知道有什么其他(更好的)方法来实现我打算做的事情。
答案 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是开源的;您可以根据现有的序列代码编写自己的音序器。编译它,测试它,然后你就参加了比赛。 (但我不建议这样做。)