모든 열의 기본값으로 테이블에 여러 행을 삽입하는 방법이 있습니까?


14

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;$$;

단일 SQL 문으로 동일한 작업을 수행하는 방법이 있습니까?


SO에 밀접하게 관련 질문에 대한 광범위한 대답 : stackoverflow.com/questions/23794405/...
어윈 Brandstetter

답변:


8

사용 generate_series()및 ctes. 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

열이 하나만 있고 열 인 경우에는를 serial사용할 수있는 방법이 없습니다 default. generate_series를 사용하는 것은 간단합니다.

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

  • UUID 함수 또는 비표준과 같이 다른 "특이한"기본값 clock_timestamp()이있는 경우 명령문은 직렬 케이스와 같이 적절히 조정해야합니다.

기본 키가 "첫 번째가 아닌"열로 정의 된 경우,이 예에서 i첫 번째가 정의 된 경우 , INSERT INTO t SELECT * FROM generate_series(1, 10)기본적으로 첫 번째 열에 할당하고 나머지를 모두 기본값으로 제공하는 것과 같은 더 간단한 버전을 사용하여 얻을 수 있습니다. 다른 쉬운 방법을 알아낼 수 없었습니다. 단 한 번만 사용하는 경우 기본 키를 사용하여 먼저 수행 할 수 있습니다. 예를 들어 일련의 값을 생성하면 예를 들어 "재사용하지 않을 것" INSERT INTO t SELECT * FROM generate_series(1000000, 1000000+10)입니다.
rogerdpack

SQL Fiddle에서 실행했을 때 첫 번째 쿼리는 table에 행을 삽입하지 않았습니다 t. SQL Fiddle을 올바르게 사용하지 않았습니까?
Derek Mahar

나는 내가 잘못한 것을 이제 이해한다. SQL Fiddle은 모든 실행을 완료시 롤백하는 트랜잭션처럼 처리합니다. 결과적으로 테이블의 행을 보려면 select * from tCTE 문 다음 에 실행해야했습니다 .
Derek Mahar

아니, 그것도 작동하지 않았다.
Derek Mahar

1
@DerekMahar SQLfiddle이 손상되어야합니다. rextester.com에 대한 답변에서 링크를 편집했습니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.