mysql :: แทรกลงในตารางข้อมูลจากตารางอื่น?


187

ฉันสงสัยว่ามีวิธีการทำเช่นนี้อย่างหมดจดใน sql:

q1 = SELECT campaign_id, from_number, received_msg, date_received 
     FROM `received_txts` WHERE `campaign_id` = '8';
INSERT INTO action_2_members (campaign_id, mobile, vote, vote_date)    
    VALUES(q1.campaign_id, q1.from_number, q1.received_msg, q1.date_received);

หมายเหตุ: q1 จะส่งคืนแถวประมาณ 30k

มีวิธีที่จะทำสิ่งที่ฉันพยายามข้างต้นใน sql ตรง? หากต้องการดึงข้อมูลโดยตรงจากตารางหนึ่ง (โดยทั่วไปเป็นตารางข้อมูลดิบ) และแทรกลงในอีกตารางหนึ่ง (โดยทั่วไปเป็นตารางข้อมูลที่ประมวลผลแล้ว)

คำตอบ:


401
INSERT INTO action_2_members (campaign_id, mobile, vote, vote_date)  
SELECT campaign_id, from_number, received_msg, date_received
  FROM `received_txts`
 WHERE `campaign_id` = '8'

1
@InSane: 1) ให้คำตอบ 2) แก้ไขการจัดรูปแบบคำถาม อย่าพลาดคำสั่งซื้อครั้งต่อไป ;-)
zerkms

ฮ่าฮ่า :-) yup .. ฉันไม่เคยจัดการลำดับความสำคัญของฉันเลย! :-D
Jagmag

1
ทำงาน! +1 สมบูรณ์และรวดเร็วมาก! ขอบคุณเพื่อน เพิ่งต้องลบวงเล็บออกจากเขตข้อมูล SELECT ...
คนที่

@zerkms; ทริกเกอร์จะทำงานกับINSERT INTO ... SELECTข้อความนี้ได้หรือไม่
haccks

2
@haccks ฉันเชื่อเช่นเดียวกับว่ามันเป็นแค่ "ปกติ"INSERT
zerkms

30

สำหรับทั้งแถว

แทรกลงใน xyz select * จาก xyz2 โดยที่ id = "1";

สำหรับคอลัมน์ที่เลือก

แทรกลงใน xyz (t_id, v_id, f_name) เลือก t_id, v_id, f_name จาก xyz2 โดยที่ id = "1";

1
วิธีการทั้งแถวล้มเหลวหากมีระเบียนที่มีอยู่แล้วด้วยคีย์หลักที่ตรงกัน
HotN

คุณพบทางออกหรือไม่? <วิธีการทั้งแถวล้มเหลวหากมีระเบียนที่มีอยู่แล้วด้วยคีย์หลักที่ตรงกัน>
Shivdhwaj Pandey

10

ตอบโดยzerkmsเป็นวิธีที่ถูกต้อง แต่ถ้ามีคนต้องการแทรกคอลัมน์พิเศษเพิ่มเติมในตารางคุณสามารถรับได้จากรายการต่อไปนี้:

INSERT INTO action_2_members (`campaign_id`, `mobile`, `email`, `vote`, `vote_date`, `current_time`)
SELECT `campaign_id`, `from_number`, 'example@domain.xyz', `received_msg`, `date_received`, 1502309889 FROM `received_txts` WHERE `campaign_id` = '8'

ในแบบสอบถามดังกล่าวข้างต้นมี 2 คอลัมน์พิเศษชื่ออีเมลและCURRENT_TIME


2
ถ้าฉันต้องการแทรกข้อมูลสามแถวด้วยค่าเดียวกันจากตัวเลือก แต่ค่าที่แตกต่างกันสำหรับคอลัมน์ 'เพิ่มเติม' ที่เพิ่มเช่นอีเมลและ current_time
xxstevenxo

4
INSERT INTO Table1 SELECT * FROM Table2

นี่เป็นคำตอบที่มีคุณภาพต่ำมาก นอกจากนี้ยังไม่ได้พยายามที่จะเกี่ยวข้องกับข้อมูลที่รวมอยู่ในคำถาม
ไมค์

0
INSERT INTO preliminary_image (style_id,pre_image_status,file_extension,reviewer_id,
uploader_id,is_deleted,last_updated) 

SELECT '4827499',pre_image_status,file_extension,reviewer_id,
uploader_id,'0',last_updated FROM preliminary_image WHERE style_id=4827488

การวิเคราะห์

เราสามารถใช้แบบสอบถามด้านบนหากเราต้องการคัดลอกข้อมูลจากตารางหนึ่งไปยังอีกตารางหนึ่งใน mysql

  1. ที่นี่ตารางต้นทางและปลายทางเหมือนกันเราสามารถใช้ตารางอื่นได้
  2. มีคอลัมน์จำนวนน้อยที่เราไม่ได้คัดลอกอย่างstyle_idและis_deletedดังนั้นเราจึงเลือกพวกมันฮาร์ดโค้ดจากตารางอื่น
  3. ตารางที่เราใช้ในซอร์สยังมีฟิลด์การเพิ่มอัตโนมัติดังนั้นเราจึงออกจากคอลัมน์นั้นและมันจะถูกแทรกโดยอัตโนมัติเมื่อมีการเรียกใช้คิวรี

ผลการดำเนินการ

ดำเนินการค้นหา 1 คำตอบ 1 ข้อสำเร็จข้อผิดพลาด 0 คำเตือน 0 รายการ

ข้อความค้นหา: แทรกลงใน preliminary_image (style_id, pre_image_status, file_extension, reviewer_id, uploader_id, is_deleted, last_updated) เลือก ...

ได้รับผลกระทบ 5 แถว

เวลาดำเนินการ: 0.385 วินาทีเวลาโอน: 0 วินาทีรวมเวลา: 0.386 วินาที

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