Apakah ada cara untuk memasukkan banyak baris ke dalam tabel dengan nilai default untuk semua kolom?

14

Saya bisa menyisipkan banyak baris ke tabel dengan nilai default untuk semua kolom dengan cara 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;$$;

Apakah ada cara untuk melakukan hal yang sama dengan pernyataan SQL tunggal?

Jack mengatakan coba topanswers.xyz
sumber
Jawaban luas untuk pertanyaan terkait erat pada SO: stackoverflow.com/questions/23794405/…
Erwin Brandstetter

Jawaban:

8

Menggunakan generate_series()dan ctes. Diuji di 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

Untuk kasus ketika hanya ada satu kolom dan itu adalah serial, saya tidak melihat cara untuk menggunakan default. Menggunakan generate_series sangat mudah:

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

  • Jika ada nilai default lain yang lebih "aneh", seperti fungsi UUID atau non-standar clock_timestamp(), pernyataan tersebut harus disesuaikan, seperti kasus seri.
ypercubeᵀᴹ
sumber
Jika kunci utama adalah kolom "bukan yang pertama" yang ditentukan, dalam contoh ini, jika ididefinisikan pertama, maka Anda dapat bertahan dengan versi yang lebih sederhana seperti INSERT INTO t SELECT * FROM generate_series(1, 10)yang pada dasarnya menetapkan ke kolom pertama dan memberikan standar untuk semua yang lain, meskipun saya tidak bisa menemukan cara mudah lainnya. Jika hanya satu kali saja maka Anda juga bisa melakukannya dengan kunci primer terlebih dahulu, misalnya dengan menghasilkan serangkaian nilai yang Anda "mungkin tidak akan menggunakan kembali" ex: INSERT INTO t SELECT * FROM generate_series(1000000, 1000000+10)kemudian mengubah angka secara manual setelah itu.
rogerdpack
Ketika saya menjalankannya di SQL Fiddle, kueri pertama tidak memasukkan baris apa pun ke tabel t. Apakah saya tidak menggunakan SQL Fiddle dengan benar?
Derek Mahar
Saya mengerti sekarang apa yang saya lakukan salah. SQL Fiddle memperlakukan setiap eksekusi seperti transaksi yang dikembalikan ketika selesai. Akibatnya, untuk melihat baris dalam tabel, saya harus mengeksekusi select * from tsetelah pernyataan CTE.
Derek Mahar
Tidak, itu juga tidak berhasil.
Derek Mahar
1
@DerekMahar SQLfiddle harus rusak. Saya telah mengedit tautan dalam jawaban saya ke rextester.com.
ypercubeᵀᴹ