ใน MySQL จะคัดลอกเนื้อหาของตารางหนึ่งไปยังตารางอื่นภายในฐานข้อมูลเดียวกันได้อย่างไร


118

ฉันยังใหม่กับ MySQL ฉันต้องการคัดลอกเนื้อหาของตารางหนึ่งไปยังอีกตารางหนึ่งในฐานข้อมูลเดียวกัน โดยพื้นฐานแล้วฉันต้องการแทรกลงในตารางจากตารางอื่น มีวิธีง่ายๆในการทำเช่นนี้หรือไม่?

คำตอบ:


184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

แก้ไข: หรือถ้าตารางมีโครงสร้างที่แตกต่างกันคุณสามารถ:

INSERT INTO TARGET_TABLE (`col1`,`col2`) SELECT `col1`,`col2` FROM SOURCE_TABLE;

แก้ไข: เพื่อ จำกัด สิ่งนี้ ..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1

จะเกิดอะไรขึ้นหากมีคนต้องการดำเนินการแทรกในตารางต้นทางระหว่างเรียกใช้แบบสอบถามนี้ มันล็อคการทำงานของแทรกหรือไม่?
Lawakush Kurmi

135

หากไม่มีตารางคุณสามารถสร้างตารางที่มีสคีมาเดียวกันดังนี้:

CREATE TABLE table2 LIKE table1;

จากนั้นในการคัดลอกข้อมูล:

INSERT INTO table2 SELECT * FROM table1

1
ฉันพบรหัสนี้SELECT * INTO newTable FROM sourceTableในw3schoolเหตุใดจึงใช้ไม่ได้ในMySQL
Kasun Siyambalapitiya

@KasunSiyambalapitiya SELECT ... INTOหมายถึงการส่งออกตารางไปยังไฟล์เอาต์พุตหรือไปยังตัวแปร ไม่ได้ลงในตารางโดยตรง ดูdev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J

@Kasun Siyambalapitiya ว่าหน้า w3school มีไว้สำหรับ SQL อื่นไม่ได้มีไว้สำหรับ MySQL ขณะนี้ w3schools มีการรายงานข้อผิดพลาดหากคุณพบปัญหาให้รายงานบนไซต์ของพวกเขาเพื่อช่วยให้มีความรู้ที่ถูกต้อง
Nightwolf

27

หาก table1 มีขนาดใหญ่และคุณไม่ต้องการล็อกไว้ในช่วงเวลาของกระบวนการคัดลอกคุณสามารถทำการถ่ายโอนข้อมูลและโหลดแทนได้:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;

ฉันลองทิ้งบน RDS โดยใช้โซลูชันstackoverflow.com/a/9536680/351903 ไฟล์ถูกสร้างขึ้น แต่ยังคงมีขนาด 0 เป็นเวลานาน นอกจากนี้ในการตรวจสอบshow processlistฉันไม่เห็นการสืบค้นใด ๆ กำลังทำงานอยู่ ไม่แน่ใจว่าเป็นปัญหาอะไร
Sandeepan Nath

15

สิ่งนี้ได้ผลสำหรับฉัน

CREATE TABLE newtable LIKE oldtable;

จำลองตารางใหม่ด้วยตารางเก่า

INSERT newtable SELECT * FROM oldtable;

คัดลอกข้อมูลแถวทั้งหมดไปยังตารางใหม่

ขอบคุณ


10

หากคุณต้องการสร้างและคัดลอกเนื้อหาในช็อตเดียวให้ใช้ SELECT:

สร้างตาราง new_tbl SELECT * จาก orig_tbl;


4
+1 - แม้ว่าตารางใหม่จะไม่มีนิยามดัชนีตั้งแต่แรก วิธีการ "สร้าง ... เช่น ... " จะคัดลอกนิยามดัชนีด้วย
Martin

2

สิ่งนี้ได้ผลสำหรับฉัน คุณสามารถทำให้คำสั่ง SELECT ซับซ้อนขึ้นได้โดยใช้คำสั่ง WHERE และ LIMIT

ขั้นแรกให้ทำซ้ำตารางขนาดใหญ่ของคุณ (โดยไม่มีข้อมูล) เรียกใช้แบบสอบถามต่อไปนี้แล้วตัดทอนตารางที่ใหญ่กว่า

INSERT INTO table_small (SELECT * FROM table_large WHERE column = 'value' LIMIT 100)

ง่ายสุด ๆ :-)


0
CREATE TABLE target_table SELECT * FROM source_table;

เพียงแค่สร้างตารางใหม่ที่มีโครงสร้างเดียวกันกับตารางต้นทางและคัดลอกแถวทั้งหมดจาก source_table ลงใน target_table

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

หากคุณต้องการคัดลอกบางแถวไปยัง target_table ให้ใช้เงื่อนไขภายในโดยที่ อนุประโยค


-3

ลองทำตามนี้ ทำงานได้ดีใน Oracle 10g ของฉัน

CREATE TABLE new_table
  AS (SELECT * FROM old_table);

8
แต่คำถามเกี่ยวกับ MySQL
Salman A

มันให้ + สำหรับสิ่งนี้เพราะมันใช้งานได้กับ MySQL ด้วย dev.mysql.com/doc/refman/5.7/en/create-table-select.html
Daniel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.