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


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.