すべての列のデフォルト値を使用してテーブルに複数の行を挿入する方法はありますか?


14

RBARの方法で、すべての列にデフォルト値を持つ複数の行をテーブルに挿入できます。

create table course(course_id serial primary key);

do $$
begin
  for i in 1..100000 loop
    insert into course default values;
  end loop;
end;$$;

単一のSQLステートメントで同じことを行う方法はありますか?


SO上密接に関連する質問への大規模な答え:stackoverflow.com/questions/23794405/...
アーウィンBrandstetter

回答:


8

とを使用generate_series()して。rextester.comでテスト済み:

create table t
( tid serial primary key,
  i int default 0,
  name text default 'Jack'
) ;


with ins as
  (insert into t (i, name)               -- all the columns except any serial
   values (default, default)
   returning i, name
  )
insert into t 
  (i, name)
select 
  ins.i, ins.name
from 
  ins cross join generate_series(1, 9);  -- one less than you need

列が1つだけでaの場合、serialを使用する方法はありませんdefault。generate_seriesの使用は簡単です:

insert into course
  (course_id)
select
  nextval('course_course_id_seq')
from
  generate_series(1, 10);

  • UUID関数や非標準clock_timestamp()など、他のより「特異な」デフォルト値がある場合、シリアルケースのように、それに応じてステートメントを調整する必要があります。

主キーが定義された「最初ではない」列である場合、この例では、最初に定義されている場合、基本的に最初の列に割り当て、残りのすべてにデフォルトを設定するiような簡単なバージョンでうまくいくことができますがINSERT INTO t SELECT * FROM generate_series(1, 10)、他の簡単な方法を理解できませんでした。それが1回だけの場合は、たとえば、おそらくおそらく再利用しない一連の値を生成することにより、主キーで最初に行うこともできますINSERT INTO t SELECT * FROM generate_series(1000000, 1000000+10)。その後、手動で数値を変更します。
rogerdpack

SQL Fiddleで実行したとき、最初のクエリはtableに行を挿入しませんでしたt。SQL Fiddleを正しく使用しませんでしたか?
デレクマハル

私は今、間違ったことを理解しています。SQL Fiddleは、すべての実行をトランザクションのように扱い、完了時にロールバックします。したがって、テーブル内の行を表示するselect * from tには、CTEステートメントの後に実行する必要がありました。
デレクマハール

いいえ、それも機能しませんでした。
デレクマハール

1
@DerekMahar SQLfiddleが壊れている必要があります。rextester.comへの回答のリンクを編集しました。
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.