如果插入一行,PostgreSQL中的高级序列(`nextval`)

时间:2016-02-04 11:14:13

标签: postgresql

我有条件地在PostgreSQL表中插入一行并手动指定ID:

INSERT INTO foo (foo_id, foo_name)
SELECT 4, 'My Name'
WHERE NOT EXISTS (
    SELECT * FROM foo WHERE foo_id = 4
);

这不会增加生成下一个foo_id的序列。

如果在上述查询中实际插入了一行,我怎么能运行SELECT nextval('foo_foo_id_seq'::regclass);

1 个答案:

答案 0 :(得分:2)

您可以使用setval()

为序列提供新值

如果要更改序列以继续使用“强制”值,可以在选择内使用setval()

INSERT INTO foo (id, foo_name)
select *
from (
  VALUES (setval('foo_id_seq', 42), 'My Name')
) as t (id, foo_name)
WHERE NOT EXISTS (
    SELECT * FROM foo WHERE id = 42
);

如果插入一行,序列将继续43。

如果当前序列值已经大于43,那么如果其他事务插入表中并依赖序列,会给您带来问题。

如果你想从当前的任何值推进序列,你可以使用这样的东西:

INSERT INTO foo (id, foo_name)
select id, foo_name
from (
  VALUES (42, 'My Name', nextval('foo_id_seq'))
) as t (id, foo_name, nextval)
WHERE NOT EXISTS (
    SELECT * FROM foo WHERE id = 42
);