我有一个表格,列中的列采用默认值:
create table indexing_table
(
id SERIAL PRIMARY KEY,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
);
如何在此表中插入多个默认行?我是否必须重复命令:
insert into indexing_table default values;
我想要插入多少次?
答案 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}}
答案 3 :(得分:0)
最简单的方法是将now()插入" created_at#34;列如此:
insert into indexing_table (created_at)
select now()
;