如果插入了行,则在PostgreSQL中使用高级序列(`nextval`)

如果插入了行,则在PostgreSQL中使用高级序列(`nextval`),postgresql,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\u id的序列 如何运行selectnextval('foo\u foo\u id\u seq':regclass)仅当在上述查询中实际插入了一行时?您可以使用setval

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

INSERT INTO foo (foo_id, foo_name)
SELECT 4, 'My Name'
WHERE NOT EXISTS (
    SELECT * FROM foo WHERE foo_id = 4
);
这不会增加生成下一个
foo\u id
的序列


如何运行
selectnextval('foo\u foo\u id\u 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
);

嗯,这很有用,但我很想确定‘我的名字’的ID是1(在我的情况下,它实际上不是1——所以它不一定是表中发生的第一次插入)。@s16h:为什么需要它?你不应该依赖于特定的ID值。我理解并同意你的看法。但是,在这种情况下,我需要这样做。insert语句是绝对正确的,我不知道我为什么用那种方式键入它。我已经编辑以反映我实际拥有的东西;搞定了!非常感谢。您希望序列继续使用该数字,还是希望增加当前值的序列?(但在这两种情况下,您都有可能在以后违反唯一的密钥)继续使用该数字将起作用。例如,在本例中,如果插入一行,我希望序列的下一个值为5。