Есть ли способ вставить несколько строк в таблицу со значениями по умолчанию для всех столбцов?


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/…
Эрвин Брандштеттер

Ответы:


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

Для случая, когда есть только один столбец, и это a 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, первый запрос не вставил ни одной строки в таблицу t. Правильно ли я использовал SQL Fiddle?
Дерек Махар

Теперь я понимаю, что я сделал не так. SQL Fiddle рассматривает каждое выполнение как транзакцию, которую она откатывает по завершении. Следовательно, чтобы увидеть строки в таблице, мне пришлось выполнить select * from tпосле оператора CTE.
Дерек Махар

Нет, это тоже не сработало.
Дерек Махар

1
@DerekMahar SQLfiddle должен быть сломан. Я отредактировал ссылку в своем ответе на rextester.com.
ypercubeᵀᴹ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.