我正在有条件地向 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);
?我正在有条件地向 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);
?您可以使用 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
);