如何使用序列字段创建表 AS SELECT

Jua*_*eza 3 postgresql create-table

此查询已经工作。

    CREATE TABLE source.road_nodes (
        node_id serial,
        node TEXT
    );

    -- SAVE UNIQUE NODES AND ASIGN ID
    INSERT INTO source.road_nodes (node)
    SELECT DISTINCT  node
    FROM
        (
            (SELECT DISTINCT node_begin AS node
            FROM map.rto)
                UNION
            (SELECT DISTINCT node_end AS node
            FROM map.rto)
        ) as node_pool; 
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法使用创建表

CREATE TABLE source.road_nodes AS SELECT ( ... )
Run Code Online (Sandbox Code Playgroud)

而不是必须创建表然后执行插入。

问题是如何创建串行列。

kli*_*lin 5

您可以创建表作为选择:

create table source.road_nodes as
select (row_number() over())::int node_id, node::text
from (  
    select node_begin node from map.rto
    union
    select node_end node from map.rto
    ) sub;
Run Code Online (Sandbox Code Playgroud)

并且表中的数据将符合预期,但该列node_id将没有默认值。

但是,您可以手动添加适当的default事后证明:

create sequence road_nodes_node_id_seq;
select setval('road_nodes_node_id_seq', 
    (select node_id from source.road_nodes order by 1 desc limit 1));
alter table source.road_nodes alter node_id set not null; -- not necessary
alter table source.road_nodes alter node_id set default 
    nextval('road_nodes_node_id_seq'::regclass);
Run Code Online (Sandbox Code Playgroud)