web-dev-qa-db-fra.com

Existe-t-il un moyen d'insérer plusieurs lignes dans un tableau avec des valeurs par défaut pour toutes les colonnes?

Je peux insérer plusieurs lignes dans un tableau avec des valeurs par défaut pour toutes les colonnes de la manière 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;$$;

Existe-t-il un moyen de faire de même avec une seule instruction SQL?

Utilisation de generate_series() et ctes. Testé dans 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

Pour le cas où il n'y a qu'une seule colonne et qu'il s'agit d'un serial, je ne vois aucun moyen d'utiliser le default. L'utilisation de generate_series est simple:

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

  • S'il existe d'autres valeurs par défaut plus "particulières", comme une fonction UUID ou la clock_timestamp() non standard, l'instruction devra être ajustée en conséquence, comme le cas de la série.
8
ypercubeᵀᴹ