簡體   English   中英

如何在PostgresQL中的表中插入多個默認行

[英]How to insert multiple default rows into a table in PostgresQL

我有一個表,列中的列采用默認值:

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

如何在此表中插入多個默認行? 我是否必須重復該命令:

insert into indexing_table default values;

我想要插入多少次?

我有同樣的問題。 有頭表只包含序列生成的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

如果您有默認值,則可以告訴數據庫使用此默認值:

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);

如果您不想為保留default values語法的任何列命名,則選項是動態構建它:

do $$
begin
execute (
    select string_agg('insert into indexing_table default values',';')
    from generate_series(1,10)
);
end; $$;

do

execute

簡單的方法是將now()插入“created_at”列,如下所示:

insert into indexing_table (created_at)
select now()
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM