আমি কীভাবে একবারে পোস্টগ্রিস টেবিলের মধ্যে একাধিক মান সন্নিবেশ করব?


94

আমার কাছে একটি টেবিল রয়েছে যা আমি একবারে একাধিক মান আপডেট করার চেষ্টা করছি। টেবিল স্কিমা এখানে:

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

আমার কাছে রয়েছে user_idএবং subservice_idএকসাথে একাধিকটি toোকাতে চাই । এর মধ্যে কোন সিনট্যাক্স রয়েছে Postgresযা আমাকে এরকম কিছু করতে দেবে

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

আমি এই কিভাবে করব?


4
আপনি যদি এগুলি সিক্যুয়েন্স থেকে সন্নিবেশ করতে চান বা dba.stackexchange.com/a/89544/16892 ব্যবহার করে generate_seriesদেখুন
রজারডপ্যাক

উত্তর:



174

মাল্টি-ভ্যালু syntোকানো সিনট্যাক্সটি হ'ল:

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

তবে ক্রোকোডিলকো এর উত্তর অনেক চটকদার।


এই পদ্ধতির যে কোনও একটি দিয়ে, আবারও ফেরার উপায় আছে id?
ডিভিটান

4
হ্যাঁ, রিটার্নিং ব্যবহার করুন। "সারণিতে (আইডি, ইয়াডা) মানগুলি (1,2), (9,22) আইডি ফেরানো; ইত্যাদি
স্কট মার্লো

4
এছাড়াও আজকাল একটি সিটিই ওরফে উইথ উইথ প্রায়শই ভাল কাজ করে।
স্কট মার্লো

পূর্ণসংখ্যার মানগুলি উপরের মতো সন্নিবেশ করতে সক্ষম। উপরের পদ্ধতিটি ব্যবহার করে পাঠ্য সন্নিবেশ করার সময় কলামের মতো এটির ত্রুটি পাওয়া যায় না। 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);
সংকর মুনিয়াপ্পা

@ সংকরমুনিয়াইপ্পা আপনি যে পাঠ্যটি serোকাচ্ছেন তার জন্য আপনাকে একক উদ্ধৃতি ব্যবহার করতে হবে ' '। সুতরাং মত কিছু, insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)কাজ করবে। আপনি না পরীক্ষা করতে এই একক এবং ডবল কোট সম্পর্কে আরো জানার জন্য বাইরে।
dr0pdb

27

ক্রোকোডিলকো জবাবের একটি সংক্ষিপ্ত সংস্করণ:

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

আমি মনে করি এটি গৃহীত উত্তরের চেয়ে অভিপ্রকাশের চেয়ে বেশি অভিব্যক্তিপূর্ণ। এই স্ট্যান্ডার্ড এসকিউএল বা পোস্টগ্র্যাস এসকিউএল-নির্দিষ্ট কি?
বার্নার্ড

4
উভয় উত্তর পোস্টগ্রাইএসকিউএল-নির্দিষ্ট। গৃহীত উত্তর সম্ভবত আরও সহজে উদাহরণস্বরূপ ওরাকল অন্যান্য উপাত্ত অনুবাদ করা হয়: insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3))
ইল্লি

ধন্যবাদ, এটি অনেক বেশি অর্থবোধ করে এবং আমার মতে গৃহীত উত্তরের চেয়ে বেশি পঠনযোগ্য।
ফ্রস্টি

4
অন্য সারণী থেকে তথ্য সহ এটি ব্যবহার করার একটি উপায়: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
এফ্রেন

12

একটি সামান্য সম্পর্কিত উত্তর কারণ আমি যতবার এই সমাধানটি মনে রাখার চেষ্টা করি আমি এই প্রশ্নটি সন্ধান করি। একাধিক কলাম সহ একাধিক সারি sertোকান :

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

3

আরও দৃ example় উদাহরণ, যখন আপনাকে অন্য সারণীতে প্রতিটি সারিটির জন্য কয়েকটি সারণিতে একাধিক সারি সন্নিবেশ করানোর প্রয়োজন হয়:

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.