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


14

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?


Réponse détaillée à une question étroitement liée à SO: stackoverflow.com/questions/23794405/…
Erwin Brandstetter

Réponses:


8

Utilisation de generate_series()et ctes. Testé sur 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 c'est 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 non standard clock_timestamp(), l'instruction devra être ajustée en conséquence, comme le cas de la série.

Si la clé primaire n'est "pas la première" colonne définie, dans cet exemple, si elle iest définie en premier, alors vous pouvez vous débrouiller quelque peu avec une version plus simple comme celle INSERT INTO t SELECT * FROM generate_series(1, 10)qui attribue essentiellement à la première colonne et donne des valeurs par défaut à tout le reste, bien que je ne pouvait pas trouver d'autres moyens faciles. Si ce n'est qu'une seule option, vous pouvez également le faire avec la clé primaire en premier, par exemple en générant une série de valeurs que vous "ne réutiliserez probablement jamais" ex: INSERT INTO t SELECT * FROM generate_series(1000000, 1000000+10)puis en changeant les nombres manuellement après cela.
rogerdpack

Lorsque je l'ai exécuté dans SQL Fiddle, la première requête n'a inséré aucune ligne dans la table t. N'ai-je pas utilisé SQL Fiddle correctement?
Derek Mahar

Je comprends maintenant ce que j'ai fait de mal. SQL Fiddle traite chaque exécution comme une transaction qu'elle annule lorsqu'elle est terminée. Par conséquent, pour voir les lignes du tableau, j'ai dû exécuter select * from taprès l'instruction CTE.
Derek Mahar

Non, ça n'a pas marché non plus.
Derek Mahar

1
@DerekMahar SQLfiddle doit être rompu. J'ai modifié le lien dans ma réponse à rextester.com.
ypercubeᵀᴹ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.