क्या सभी स्तंभों के लिए डिफ़ॉल्ट मानों वाली तालिका में कई पंक्तियों को सम्मिलित करने का एक तरीका है?


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

वहाँ एक ही एसक्यूएल बयान के साथ एक ही करने का एक तरीका है?


जवाबों:


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। Gener_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)फिर उसके बाद मैन्युअल रूप से संख्याओं को बदलना।
1

जब मैंने इसे एसक्यूएल फिडल में चलाया तो पहली क्वेरी में कोई पंक्तियाँ नहीं डाली गईं t। क्या मैंने एसक्यूएल फिडल का सही इस्तेमाल नहीं किया?
डेरेक महार

मुझे समझ में आया कि अब मैंने क्या गलत किया। एसक्यूएल फिडल हर निष्पादन को एक लेन-देन की तरह मानता है जो इसे पूरा होने पर वापस रोल करता है। नतीजतन, तालिका में पंक्तियों को देखने के लिए, मुझे select * from tसीटीई के बयान के बाद निष्पादित करना पड़ा ।
डेरेक महार

नहीं, यह भी काम नहीं किया।
डेरेक महार

1
@DerekMahar SQLfiddle को तोड़ा जाना चाहिए। मैंने अपने उत्तर के लिंक को rextester.com पर संपादित किया है।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.