Tüm sütunlar için varsayılan değerleri olan bir tabloya birden çok satır eklemenin bir yolu var mı?


14

RBAR yolu tüm sütunlar için varsayılan değerleri olan bir tabloya birden çok satır ekleyebilirsiniz :

create table course(course_id serial primary key);

do $$
begin
  for i in 1..100000 loop
    insert into course default values;
  end loop;
end;$$;

Aynı şeyi tek bir SQL deyimiyle yapmanın bir yolu var mı?


SO ile yakından ilgili bir soruya kapsamlı cevap: stackoverflow.com/questions/23794405/…
Erwin Brandstetter

Yanıtlar:


8

Kullanmak generate_series()ve sandıklar. Rextester.com'da test edilmiştir :

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

Sadece bir sütun olduğunda ve bu bir durumda serial, ben kullanmanın hiçbir yolu göremiyorum default. Create_series kullanmak basittir:

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

  • Bir UUID işlevi veya standart dışı gibi daha "kendine özgü" varsayılan değerler varsa, clock_timestamp()ifadenin seri durum gibi buna göre ayarlanması gerekir.

Birincil anahtar "ilk değil" sütunu olarak tanımlanmışsa, bu örnekte, iilk olarak tanımlanmışsa, INSERT INTO t SELECT * FROM generate_series(1, 10)temelde ilk sütuna atayan ve geri kalanına varsayılan değer veren daha basit bir sürümle başlayabilirsiniz. başka kolay yolu bulamadı. Eğer sadece bir tane kapalıysa, ilk önce birincil anahtarla da yapabilirsiniz, örneğin bir dizi değer oluşturarak ex: "muhtemelen asla yeniden kullanmazsınız", INSERT INTO t SELECT * FROM generate_series(1000000, 1000000+10)daha sonra sayıları manuel olarak değiştirirsiniz.
rogerdpack

SQL Fiddle'da çalıştırdığımda, ilk sorgu tabloya herhangi bir satır eklemedi t. SQL Fiddle'ı doğru kullanmadım mı?
Derek Mahar

Şimdi neyi yanlış yaptığımı anlıyorum. SQL Fiddle, her yürütmeyi tamamlandığında geri aldığı bir işlem gibi ele alır. Sonuç olarak, tablodaki satırları görmek select * from tiçin CTE ifadesinden sonra yürütmek zorunda kaldım .
Derek Mahar

Hayır, bu da işe yaramadı.
Derek Mahar

1
@DerekMahar SQLfiddle bozuk olmalıdır. Yanıtımı rextester.com'a düzenledim.
ypercubeᵀᴹ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.