C'è un modo per inserire più righe in una tabella con i valori predefiniti per tutte le colonne?


14

Posso inserire più righe in una tabella con i valori predefiniti per tutte le colonne nel modo 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;$$;

C'è un modo di fare lo stesso con una singola istruzione SQL?


Ampia risposta a una domanda strettamente correlata su SO: stackoverflow.com/questions/23794405/…
Erwin Brandstetter,

Risposte:


8

Utilizzando generate_series()e ctes. Testato su 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

Nel caso in cui vi sia una sola colonna ed è una serial, non vedo alcun modo di usare il default. L'uso di generate_series è semplice:

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

  • Se esistono altri valori predefiniti più "peculiari", come una funzione UUID o non standard clock_timestamp(), l'istruzione dovrà essere adattata di conseguenza, come nel caso seriale.

Se la chiave primaria è "non la prima" colonna definita, in questo esempio, se iè definita per prima, allora puoi in qualche modo cavartela con una versione più semplice come quella INSERT INTO t SELECT * FROM generate_series(1, 10)che assegna sostanzialmente alla prima colonna e dà le impostazioni predefinite a tutto il resto, sebbene io non riuscivo a capire altri modi semplici. Se è solo una volta, puoi anche farlo prima con la chiave primaria, ad esempio generando una serie di valori che "probabilmente non riutilizzerai mai" es: INSERT INTO t SELECT * FROM generate_series(1000000, 1000000+10)quindi cambiando i numeri manualmente dopo.
rogerdpack,

Quando l'ho eseguito in SQL Fiddle, la prima query non ha inserito alcuna riga nella tabella t. Non ho usato SQL Fiddle correttamente?
Derek Mahar,

Ora capisco cosa ho fatto di sbagliato. SQL Fiddle considera ogni esecuzione come una transazione che esegue il rollback al termine. Di conseguenza, per vedere le righe nella tabella, ho dovuto eseguire select * from tdopo l'istruzione CTE.
Derek Mahar,

No, neanche quello ha funzionato.
Derek Mahar,

1
@DerekMahar SQLfiddle deve essere rotto. Ho modificato il link nella mia risposta a rextester.com.
ypercubeᵀᴹ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.