it-swarm.asia

كيفية إدراج القيم في جدول من استعلام تحديد في PostgreSQL؟

لدي جدول items (item_id serial, name varchar(10), item_group int) وجدول items_ver (id serial, item_id int, name varchar(10), item_group int).

الآن أريد إدراج صف في items_ver من items. هل هناك أي بناء جملة SQL للقيام بذلك؟

لقد حاولت مع:

INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);

ولكن لدي خطأ في بناء الجملة:

ERROR:  syntax error at or near "select"
LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item...

حاولت الآن:

INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

عملت بشكل أفضل ولكني حصلت على خطأ:

ERROR:  column "item_group" is of type integer but expression is of type 
character varying
LINE 1: INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

قد يكون هذا بسبب تعريف الأعمدة بترتيب مختلف في الجداول. هل ترتيب العمود مهم؟ تمنيت أن يتطابق PostgreSQL مع أسماء الأعمدة.

225
Jonas

لا يهم ترتيب الأعمدة إذا كان (وإذا كان فقط) يتطابق ترتيب الأعمدة ، فيمكنك على سبيل المثال:

insert into items_ver
select * from items where item_id=2;

أو إذا لم تتطابق ، يمكنك على سبيل المثال:

insert into items_ver(item_id, item_group, name)
select * from items where item_id=2;

لكن الاعتماد على ترتيب الأعمدة هو خطأ في انتظار حدوثه (يمكن أن يتغير ، كما هو الحال مع عدد الأعمدة) - كما أنه يجعل قراءة SQL الخاصة بك أكثر صعوبة

لا يوجد "اختصار" جيد - يجب عليك سرد الأعمدة بشكل صريح لكل من الجدول الذي تقوم بإدراجه والاستعلام الذي تستخدمه لبيانات المصدر ، على سبيل المثال:

insert into items_ver (item_id, name, item_group)
select item_id, name, item_group from items where item_id=2;

dbfiddle هنا

328
Jack says try topanswers.xyz
INSERT INTO test_import_two (name, name1, name2) 
(SELECT name, name1, name2 FROM test_import_one WHERE id = 2)

لنفس الجدول

INSERT INTO test_import_three (id1, name1, name2) 
(SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)
12
Nirmal Sharma