Gibt es eine Möglichkeit, mehrere Zeilen mit Standardwerten für alle Spalten in eine Tabelle einzufügen?

14

Ich kann auf RBAR- Weise mehrere Zeilen mit Standardwerten für alle Spalten in eine Tabelle einfügen :

create table course(course_id serial primary key);

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

Gibt es eine Möglichkeit, dasselbe mit einer einzelnen SQL-Anweisung zu tun?

Jack Douglas
quelle
Umfassende Antwort auf eine eng verwandte Frage zu SO: stackoverflow.com/questions/23794405/…
Erwin Brandstetter

Antworten:

8

Mit generate_series()und ctes. Getestet in 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

Für den Fall, dass es nur eine Spalte gibt und es sich um eine handelt serial, sehe ich keine Möglichkeit, die zu verwenden default. Die Verwendung der generate_series ist einfach:

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

  • Wenn es andere, "eigentümlichere" Standardwerte gibt, wie eine UUID-Funktion oder die Nicht-Standard-Funktion clock_timestamp(), muss die Anweisung entsprechend angepasst werden, wie im seriellen Fall.
ypercubeᵀᴹ
quelle
Wenn der Primärschlüssel "nicht die erste" Spalte ist, die in diesem Beispiel definiert wurde, und wenn die erste Spalte definiert wurde, ikönnen Sie mit einer einfacheren Version wie der, INSERT INTO t SELECT * FROM generate_series(1, 10)die im Grunde der ersten Spalte zugewiesen ist und allen anderen die Standardeinstellungen gibt, etwas auskommen , obwohl ich Ich konnte keine anderen einfachen Wege finden. Wenn es nur ein Einzelfall ist, können Sie dies auch zuerst mit dem Primärschlüssel tun, indem Sie beispielsweise eine Reihe von Werten generieren, die Sie "wahrscheinlich nie wiederverwenden", z. B. und INSERT INTO t SELECT * FROM generate_series(1000000, 1000000+10)anschließend manuell ändern.
Rogerdpack
Als ich es in SQL Fiddle ausführte, fügte die erste Abfrage keine Zeilen in die Tabelle ein t. Habe ich SQL Fiddle nicht richtig benutzt?
Derek Mahar
Ich verstehe jetzt, was ich falsch gemacht habe. SQL Fiddle behandelt jede Ausführung wie eine Transaktion, die nach Abschluss zurückgesetzt wird. Folglich musste ich, um die Zeilen in der Tabelle zu sehen, select * from tnach der CTE-Anweisung ausführen .
Derek Mahar
Nein, das hat auch nicht funktioniert.
Derek Mahar
1
@DerekMahar SQLfiddle muss kaputt sein. Ich habe den Link in meiner Antwort auf rextester.com bearbeitet.
ypercubeᵀᴹ