Làm cách nào để chèn nhiều giá trị vào bảng postgres cùng một lúc?


93

Tôi có một bảng mà tôi đang cố gắng cập nhật nhiều giá trị cùng một lúc. Đây là lược đồ bảng:

    Column     |  Type   | Modifiers 
---------------+---------+-----------
 user_id       | integer | 
 subservice_id | integer |

Tôi có user_idvà muốn chèn nhiều subservice_idcái cùng một lúc. Có cú pháp nào trong Postgresđó sẽ cho phép tôi làm điều gì đó như thế này không

insert into user_subservices(user_id, subservice_id) values(1, [1, 2, 3]);

Làm thế nào tôi sẽ làm điều này?


1
Nếu bạn muốn chèn chúng từ một chuỗi, hoặc sử dụng generate_seriessee dba.stackexchange.com/a/89544/16892
rogerdpack

Câu trả lời:



172

Cú pháp chèn nhiều giá trị là:

insert into table values (1,1), (1,2), (1,3), (2,1);

Nhưng câu trả lời của krokodilko còn lấp lửng hơn nhiều.


Với một trong hai phương thức này, có cách nào để trả về idkhông?
dvtan

2
Có, sử dụng trả lại. "chèn vào bảng (id, yada) giá trị (1,2), (9,22) trả về id;" vv
Scott Marlowe

1
Ngoài ra, ngày nay câu lệnh CTE hay còn gọi là WITH thường hoạt động tốt.
Scott Marlowe

Giá trị số nguyên có thể chèn như trên. Nhưng trong khi chèn văn bản bằng phương pháp trên, lỗi như cột của nó không tồn tại. insert into orders_cancel_reasons_infos values (1,1,"Changed my mind",1), (2,2,"Quality not satisfactory",1), (3,3,"Incompatible or not useful",1), (4,4,"Damaged product but shipping box is good",1), (5,5,"Items arrived too late",1), (6,6,"Missing part or accessories",1), (7,7,"Product and shipping box are damaged",1), (8,8,"Wrong item was sent",1), (9,9,"Defective item",1), (10,10,"Inaccurate description",1), (11,11,"Other",1);
muniyappa Sankar

@sankarmuniyappa, bạn sẽ phải sử dụng các dấu ngoặc kép ' 'cho văn bản mà bạn đang chèn. vì vậy một cái gì đó như, insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)sẽ hoạt động. Bạn có thể kiểm tra điều này để biết thêm về dấu ngoặc kép và đơn.
dr0pdb

25

Một phiên bản ngắn hơn của câu trả lời của krokodilko:

insert into user_subservices(user_id, subservice_id) 
values(1, unnest(array[1, 2, 3]));

Tôi nghĩ điều này thể hiện ý định hơn là câu trả lời được chấp nhận. Đây là SQL tiêu chuẩn hoặc PostgreSQL cụ thể?
Bernard

3
Cả hai câu trả lời đều dành riêng cho PostgreSQL. Câu trả lời được chấp nhận có lẽ dễ dàng hơn dịch sang cơ sở dữ liệu khác, Oracle ví dụ: insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3)).
yallie

Cảm ơn, điều này có ý nghĩa hơn rất nhiều và dễ đọc hơn câu trả lời được chấp nhận theo ý kiến ​​của tôi.
băng giá

1
Một cách để sử dụng điều này với thông tin từ một bảng khác: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
Efren

12

Một câu trả lời hơi liên quan bởi vì tôi luôn tìm thấy câu hỏi này mỗi khi tôi cố gắng nhớ lời giải này. Chèn nhiều hàng với nhiều cột :

insert into user_subservices (user_id, subservice_id)
select *
from unnest(array[1, 2], array[3, 4]);

3

Ví dụ mạnh mẽ hơn, khi bạn cần chèn nhiều hàng vào một số bảng cho mọi hàng trong bảng khác:

INSERT INTO user_subservices (user_id, subservice_id)
SELECT users.id AS user_id, subservice_id
FROM users
CROSS JOIN unnest(ARRAY[1,2,3]) subservice_id;
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.