ฉันจะแทรกหลายค่าลงในตาราง postgres พร้อมกันได้อย่างไร


93

ฉันมีตารางที่พยายามอัปเดตหลายค่าพร้อมกัน นี่คือสคีมาตาราง:

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

ฉันมีuser_idและต้องการแทรกหลายรายการsubservice_idพร้อมกัน มีไวยากรณ์Postgresไหมที่จะให้ฉันทำอะไรแบบนี้

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

ฉันจะทำอย่างไร


1
หากคุณต้องการแทรกจากลำดับหรือใช้generate_seriesดูdba.stackexchange.com/a/89544/16892
rogerdpack

คำตอบ:



172

ไวยากรณ์ของการแทรกหลายค่าคือ:

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

แต่คำตอบของ krokodilko นั้นสั่นมาก


ด้วยวิธีใดวิธีหนึ่งเหล่านี้มีวิธีคืนค่าด้วยidหรือไม่?
dvtan

2
ใช่ใช้การส่งคืน "แทรกลงในตาราง (id, yada) ค่า (1,2), (9,22) ส่งคืน id;" ฯลฯ
Scott Marlowe

1
นอกจากนี้ในปัจจุบันคำสั่ง CTE aka WITH มักจะใช้งานได้ดี
Scott Marlowe

ค่าจำนวนเต็มสามารถแทรกได้เหมือนข้างบน แต่ในขณะที่แทรกข้อความโดยใช้วิธีการด้านบนมันไม่มีข้อผิดพลาดในการรับเช่นคอลัมน์ 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);
sankar muniyappa

@sankarmuniyappa คุณจะต้องใช้เครื่องหมายคำพูดเดี่ยว' 'สำหรับข้อความที่คุณกำลังแทรก บางอย่างเช่น insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)จะได้ผล คุณสามารถตรวจสอบนี้ออกสำหรับข้อมูลเพิ่มเติมเกี่ยวเดี่ยวและคู่คำพูด
dr0pdb

25

คำตอบของ krokodilko รุ่นสั้น:

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

ฉันคิดว่านี่เป็นการแสดงเจตนามากกว่าคำตอบที่ยอมรับ SQL มาตรฐานหรือ PostgreSQL เฉพาะหรือไม่
Bernard

3
คำตอบทั้งสองเป็นคำตอบเฉพาะของ PostgreSQL คำตอบที่ได้รับการยอมรับอาจจะแปลได้ง่ายขึ้นไปยังฐานข้อมูลอื่น ๆ ของ Oracle insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3))ตัวอย่างเช่น:
yallie

ขอบคุณสิ่งนี้สมเหตุสมผลกว่าและอ่านได้ง่ายกว่าคำตอบที่ยอมรับในความคิดของฉัน
หนาวจัด

1
วิธีใช้กับข้อมูลจากตารางอื่น: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
Efren

12

คำตอบที่เกี่ยวข้องเล็กน้อยเพราะฉันมักจะพบคำถามนี้ทุกครั้งที่พยายามจำคำตอบนี้ แทรกหลายแถวที่มีหลายคอลัมน์ :

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

3

ตัวอย่างที่มีประสิทธิภาพมากขึ้นเมื่อคุณต้องการแทรกหลายแถวในบางตารางสำหรับทุกแถวในตารางอื่น:

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.