มีวิธีแทรกหลายแถวในตารางที่มีค่าเริ่มต้นสำหรับคอลัมน์ทั้งหมดหรือไม่


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/ …
Erwin 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 ซอแบบสอบถามแรกไม่ได้แทรกแถวใด ๆ tลงในตาราง ฉันใช้ SQL Fiddle ไม่ถูกต้องหรือไม่
Derek Mahar

ตอนนี้ฉันเข้าใจแล้วว่าฉันทำอะไรผิด SQL Fiddle ปฏิบัติต่อทุกการดำเนินการเช่นธุรกรรมที่ย้อนกลับเมื่อเสร็จสิ้น ดังนั้นเพื่อที่จะเห็นแถวในตารางฉันต้องดำเนินการselect * from tหลังจากคำสั่ง CTE
Derek Mahar

ไม่นั่นไม่ได้ผลเช่นกัน
Derek Mahar

1
@DerekMahar SQLfiddle ต้องใช้งานไม่ได้ ฉันได้แก้ไขลิงก์ในคำตอบของฉันไปที่ rextester.com
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.