Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

คัดลอกข้อมูลระหว่างตารางที่มีโครงสร้างต่างกันใน MySQL ด้วย INSERT INTO SELECT

สามารถคัดลอกข้อมูลจากตารางหนึ่งไปอีกตารางที่มีชื่อคอลัมน์/จำนวนคอลัมน์ต่างกันได้โดยใช้ INSERT INTO ... SELECT โดยระบุคอลัมน์ปลายทางและคอลัมน์ต้นทางให้ตรงกัน

Syntax

INSERT INTO target_table (col1, col2, col3)
SELECT source_col1, source_col2, source_col3
FROM source_table;

ตัวอย่างการใช้งาน

1. สร้างตารางต้นทาง (DemoTable1900) มี AUTO_INCREMENT

mysql> create table DemoTable1900 ( 
    -> ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    -> ClientName varchar(20), 
    -> ClientAge int default 29 
    -> ) auto_increment=1000; Query OK, 0 rows affected (0.00 sec)

2. เพิ่มข้อมูลในตารางต้นทาง

mysql> insert into DemoTable1900(ClientName,ClientAge) values('Chris',45); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1900(ClientName,ClientAge) values('David',29); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1900(ClientName,ClientAge) values('Mike',37); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1900(ClientName) values('Sam'); Query OK, 1 row affected (0.00 sec)  -- ใช้ Default Age=29

ข้อมูลต้นทาง:

mysql> select * from DemoTable1900;
+----------+------------+-----------+
| ClientId | ClientName | ClientAge |
+----------+------------+-----------+
|     1000 | Chris      |        45 |
|     1001 | David      |        29 |
|     1002 | Mike       |        37 |
|     1003 | Sam        |        29 |
+----------+------------+-----------+
4 rows in set (0.00 sec)

3. สร้างตารางปลายทาง (โครงสร้างต่าง)

mysql> create table DemoTable1901 ( EmployeeId int, EmployeeName varchar(20), EmployeeAge int ); Query OK, 0 rows affected (0.00 sec)

4. คัดลอกข้อมูล Map คอลัมน์

mysql> insert into DemoTable1901(EmployeeId,EmployeeName,EmployeeAge) 
    -> select ClientId,ClientName,ClientAge from DemoTable1900; 
Query OK, 4 rows affected (0.00 sec) Records: 4  Duplicates: 0  Warnings: 0

5. ตรวจสอบผลลัพธ์

mysql> select * from DemoTable1901;
+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
|       1000 | Chris        |          45 |
|       1001 | David        |          29 |
|       1002 | Mike         |          37 |
|       1003 | Sam          |          29 |
+------------+--------------+-------------+
4 rows in set (0.00 sec)

กรณีพิเศษ: คอลัมน์ AUTO_INCREMENT ในปลายทาง

-- ถ้าตารางปลายทางมี AUTO_INCREMENT ให้ละคอลัมน์ ID ไป
INSERT INTO DemoTable1901(EmployeeName,EmployeeAge) 
SELECT ClientName, ClientAge FROM DemoTable1900;  -- EmployeeId จะ Auto Generate

คำสั่งที่เกี่ยวข้อง

-- คัดลอกโครงสร้าง + ข้อมูล (CREATE TABLE ... LIKE + INSERT)
CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;

-- คัดลอกเฉพาะโครงสร้าง
CREATE TABLE new_table LIKE old_table;

สรุป: ใช้ INSERT INTO target(cols...) SELECT source_cols FROM source_table เพื่อคัดลอกข้อมูลระหว่างตารางโครงสร้างต่างกัน โดย Map คอลัมน์ตามลำดับที่ระบุ