在postgresql中更新/插入非常慢。因此,通常更快地使用新字段/行创建新表,然后替换旧表
问题是我需要一个自动数字,所以在这种情况下我必须先创建表并稍后再插入。
有没有办法在select中创建一个自动数字字段,所以我可以使用
CREATE TABLE source.road_nodes AS
SELECT serial_field, node
而不是CREATE TABLE
+ INSERT
。
CREATE TABLE source.road_nodes (
node_id serial,
node TEXT
);
INSERT INTO source.road_nodes (node)
SELECT DISTINCT node
FROM
(
SELECT DISTINCT node_begin AS node
FROM source.vzla_rto
) as node_pool;
答案 0 :(得分:0)
在某种程度上这是可能的。您可以利用the PostgreSQL documentation - 8.1.4. Serial Types状态:
这一事实
CREATE TABLE tablename ( colname SERIAL );
相当于指定:
CREATE SEQUENCE tablename_colname_seq; CREATE TABLE tablename ( colname integer NOT NULL DEFAULT nextval('tablename_colname_seq') ); ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
单独创建序列并将下一个值设为列的默认值,实际上将其设为SERIAL
列。
CREATE SEQUENCE road_nodes_node_id_seq;
CREATE TABLE road_nodes AS
SELECT DISTINCT ON (node) nextval('road_nodes_node_id_seq') AS node_id, node FROM vzla_rto;
ALTER TABLE road_nodes ALTER node_id SET NOT NULL, ALTER COLUMN node_id SET DEFAULT nextval('road_nodes_node_id_seq');
您可以保留序列,并在重新创建表时将其重置为一个。
我不会说这是一种优雅的方式,可能最简单的方法就是单独创建表格。