Existe uma maneira de inserir várias linhas em uma tabela com valores padrão para todas as colunas?

14

Posso inserir várias linhas em uma tabela com valores padrão para todas as colunas da maneira 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 uma maneira de fazer o mesmo com uma única instrução SQL?

Jack diz que tenta topanswers.xyz
fonte
Resposta extensa a uma pergunta intimamente relacionado no SO: stackoverflow.com/questions/23794405/...
Erwin Brandstetter

Respostas:

8

Usando generate_series()e ctes. Testado em 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

Para o caso em que há apenas uma coluna e é uma serial, não vejo como usar odefault . O uso do generate_series é direto:

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

  • Se houver outros valores padrão mais "peculiares", como uma função UUID ou não padronizada clock_timestamp(), a instrução deverá ser ajustada adequadamente, como o caso serial.
ypercubeᵀᴹ
fonte
Se a chave primária "não for a primeira" coluna definida, neste exemplo, se ifor definida primeiro, você poderá se familiarizar com uma versão mais simples, como a INSERT INTO t SELECT * FROM generate_series(1, 10)que basicamente atribui à primeira coluna e fornece padrões para todo o resto, embora eu não conseguia descobrir outras maneiras fáceis. Se é apenas uma opção, você também pode fazer isso com a chave primária primeiro, por exemplo, gerando uma série de valores que "provavelmente nunca reutilizará" ex: INSERT INTO t SELECT * FROM generate_series(1000000, 1000000+10)alterando os números manualmente depois disso.
Rogerdpack
Quando o executei no SQL Fiddle, a primeira consulta não inseriu nenhuma linha na tabela t. Eu não usei o SQL Fiddle corretamente?
Derek Mahar
Agora entendo o que fiz de errado. O SQL Fiddle trata cada execução como uma transação que é revertida quando concluída. Consequentemente, para ver as linhas na tabela, tive que executar select * from tapós a instrução CTE.
Derek Mahar
Não, isso também não funcionou.
Derek Mahar
1
O @DerekMahar SQLfiddle deve estar quebrado. Editei o link na minha resposta para rextester.com.
ypercubeᵀᴹ