Có cách nào để chèn nhiều hàng vào một bảng với các giá trị mặc định cho tất cả các cột không?


14

Tôi có thể chèn nhiều hàng vào một bảng với các giá trị mặc định cho tất cả các cột theo cách 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;$$;

Có cách nào làm tương tự với một câu lệnh SQL không?


Câu trả lời mở rộng cho một câu hỏi liên quan chặt chẽ trên SO: stackoverflow.com/questions/23794405/iêng
Erwin Brandstetter

Câu trả lời:


8

Sử dụng generate_series()và byte. Đã thử nghiệm trong 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

Đối với trường hợp khi chỉ có một cột và đó là một serial, tôi thấy không có cách nào để sử dụng default. Sử dụng Gener_series rất đơn giản:

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

  • Nếu có các giá trị mặc định "khác thường" hơn, như hàm UUID hoặc không chuẩn clock_timestamp(), câu lệnh sẽ phải được điều chỉnh tương ứng, như trường hợp nối tiếp.

Nếu khóa chính là cột "không phải là cột đầu tiên" được xác định, trong ví dụ này, nếu iđược xác định trước, thì bạn có thể phần nào nhận được bằng một phiên bản đơn giản hơn như INSERT INTO t SELECT * FROM generate_series(1, 10)về cơ bản gán cho cột đầu tiên và mặc định cho tất cả các phần còn lại, mặc dù tôi không thể tìm ra bất kỳ cách dễ dàng khác. Nếu đó chỉ là một lần tắt thì trước tiên bạn cũng có thể thực hiện bằng khóa chính bằng cách tạo một loạt các giá trị mà bạn "có thể không bao giờ sử dụng lại" ví dụ: INSERT INTO t SELECT * FROM generate_series(1000000, 1000000+10)sau đó thay đổi số theo cách thủ công.
rogerdpack

Khi tôi chạy nó trong SQL Fiddle, truy vấn đầu tiên không chèn bất kỳ hàng nào vào bảng t. Tôi đã không sử dụng SQL Fiddle chính xác?
Derek Mahar

Tôi hiểu bây giờ những gì tôi đã làm sai. SQL Fiddle xử lý mọi thực thi giống như một giao dịch mà nó khôi phục khi hoàn thành. Do đó, để xem các hàng trong bảng, tôi đã phải thực thi select * from tsau câu lệnh CTE.
Derek Mahar

Không, điều đó cũng không làm việc.
Derek Mahar

1
@DerekMahar SQLfiddle phải bị hỏng. Tôi đã chỉnh sửa liên kết trong câu trả lời của mình cho rextester.com.
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.