我在postgres数据库中有一个表,当我描述它时它看起来是这样的。

                                  Table "public.statistical_outputs"
      Column       |           Type           |                            Modifiers
-------------------+--------------------------+------------------------------------------------------------------
 id                | bigint                   | not null default nextval('statistical_outputs_id_seq'::regclass)

我想知道如果使用如下语句,将在id列中插入什么值
insert into statistical_outputs VALUES (DEFAULT);

我试过像
select nextval('id') from statistical_outputs;

但它不起作用。
可能相关的问题:
postgresql sequence nextval in schema
PostgreSQL nextval and currval in same query
这些问题可能是:
Get the default values of table columns in Postgres?
然而,Chris给出的答案是我想要的,而不必查看信息模式(我想我已经尝试过了,但没有成功)。

最佳答案

无法直接执行所需的操作-无法预览值。
想象:

regress=> CREATE TABLE crazy (blah integer, rand float4 default random());
CREATE TABLE
regress=> insert into crazy(blah, rand) values (1, DEFAULT);
INSERT 0 1
regress=> select * from crazy;
 blah |   rand
------+----------
    1 | 0.932575
(1 row)

random()是一个volatile函数,每次返回不同的值。因此,任何预览该值的尝试都只能获得与要插入的值不同的值。
对于nextval也是如此,因为并发事务会影响值,即使您直接读取当前的序列位置,PostgreSQL也会试图阻止您这样做(因为它会产生错误的结果)。用random来思考这个问题比用nextval来思考这个问题更为明显。
因此,对于可变默认值,您所能做的就是:
自己计算默认表达式,然后在insert中提供值,即调用SELECT nextval('statistical_outputs_id_seq')然后INSERT INTO ... VALUES (..., 'the value from nextval()');
使用RETURNING获取生成的值
我建议后者。前者在一般情况下是烦人和困难的,因为默认值可以是任意表达式。
RETURNING示例:
regress=> insert into crazy(blah, rand) values (1, DEFAULT) RETURNING rand;
   rand
----------
 0.975092
(1 row)

INSERT 0 1

10-06 14:38