如何在PostgresQL中的表中插入多个默认行

时间:2015-01-29 00:53:22

标签: sql postgresql insert sql-insert

我有一个表格,列中的列采用默认值:

create table indexing_table
(
  id SERIAL PRIMARY KEY,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
);

如何在此表中插入多个默认行?我是否必须重复命令:

insert into indexing_table default values;

我想要插入多少次?

4 个答案:

答案 0 :(得分:2)

我有同样的问题。有头表只包含序列生成的id。我需要在快照表中插入行,当然我必须首先填充标题。所以我有许多行的临时表,并希望快速插入两个表。

循环很容易编写,但它不是一种优化查询的方法(在实现过程中,它在不同的数据库/方案上运行了数千次)

可以使用特定值运行插入

INSERT INTO csh33 (id)
    SELECT (SELECT last_value FROM csh33_id_seq) + row_number() OVER ()
        FROM temp_tss11;

-- Primary key "id" is Serial so dont name it
INSERT INTO css33 (header_id, time_from, time_to, code, name)
    SELECT (SELECT last_value FROM csh33_id_seq) + row_number() OVER (), now(), null, code, name, FROM temp_tss11;

SELECT setval('csh33_id_seq', (SELECT max(id) FROM csh33) + 1);

或者我不能用默认值命名字段

INSERT INTO csh33 SELECT FROM temp_tss11;

-- But must consider raised sequence in filling snapshot table (Don't care about ordering, so only subtract)
INSERT INTO css33 (header_id, time_from, time_to, code, name)
    SELECT (SELECT last_value FROM csh33_id_seq) - row_number() OVER (), now(), null, code, name, FROM temp_tss11;

但是对于你的问题

INSERT INTO yourTableName SELECT generate_series(1,100)

注意我使用PG 9.4

答案 1 :(得分:1)

如果您有默认值,则可以告诉数据库使用此默认值:

INSERT INTO indexing_table(id, created_at) 
VALUES(default, default), 
  (default, default), 
  (default, default);

如果您需要数百个默认记录,其中一个默认值为" now()",请使用generate_series():

INSERT INTO indexing_table(created_at)
SELECT NOW() FROM generate_series(1,100);

答案 2 :(得分:1)

如果您不想为保留do $$ begin execute ( select string_agg('insert into indexing_table default values',';') from generate_series(1,10) ); end; $$; 语法的任何列命名,则选项是动态构建它:

{{1}}

do

execute

答案 3 :(得分:0)

最简单的方法是将now()插入" created_at#34;列如此:

insert into indexing_table (created_at)
select now()
;