您可以使用 CTE 从序列中检索一次值并重复使用它:
WITH cte AS (
SELECT nextval('foo_id_seq') AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM cte;
带有数据修改命令的CTE需要 Postgres 9.1 或更高版本。
如果您不确定序列的名称,请
pg_get_serial_sequence()
改用:
WITH i AS (
SELECT nextval(pg_get_serial_sequence('foo', 'id')) AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM i;
如果表名“foo”在数据库中的所有模式中可能不是唯一的,请对其进行模式限定。如果任何名称的拼写不标准,则必须双引号:
pg_get_serial_sequence('"My_odd_Schema".foo', 'id')
快速测试表明@Mark 的想法也可能有效:lastval()
INSERT INTO foo (ltree) VALUES ('1.' || lastval());
currval
nextval
返回当前会话中此序列最近获得的值。(如果nextval
在此会话中从未为此序列调用过,则会报告错误。)因为这将返回一个会话本地值,所以它给出了一个可预测的答案,无论nextval
自当前会话以来其他会话是否已执行。
此功能需要USAGE
或SELECT
对序列具有特权。
lastval
nextval
返回当前会话中最近返回的值。此函数与 相同currval
,不同之处在于它不是将序列名称作为参数,而是引用nextval
当前会话中最近应用的序列。lastval
如果nextval
当前会话中尚未调用,则调用是错误的。
此功能需要USAGE
或SELECT
对最后使用的序列具有特权。
大胆强调我的。
但是,正如@Bernard 评论的那样,它毕竟可能会失败:不能保证在调用填充第二列之前nextval()
填充默认值(并在过程中调用)。所以坚持第一个解决方案并确保。 lastval()
ltree
nextval()