我有条件地在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);
?
答案 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
);