有没有办法将多行插入到表中,所有列都有默认值?

Jac*_*las 16 postgresql default-value postgresql-9.4

我可以通过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;$$;
Run Code Online (Sandbox Code Playgroud)

有没有办法用单个 SQL 语句做同样的事情?

Jas*_*sen 11

没有规定 select 语句必须返回一列或多列。

如果选择在多行中返回零列,您将插入带有所有默认值的行。

INSERT INTO table_name 
  SELECT FROM generate_series(1,10);
Run Code Online (Sandbox Code Playgroud)


ype*_*eᵀᴹ 9

使用generate_series()和 ctes。在reextester.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
Run Code Online (Sandbox Code Playgroud)

对于只有一列并且它是 a 的情况serial,我认为无法使用default. 使用 generate_series 很简单:

insert into course
  (course_id)
select
  nextval('course_course_id_seq')
from
  generate_series(1, 10);
Run Code Online (Sandbox Code Playgroud)
  • 如果还有其他更“特殊”的默认值,例如 UUID 函数或非标准的clock_timestamp(),则必须相应地调整语句,例如串行情况。