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

INSERT ข้อมูลจากตารางหนึ่งไปอีกตารางที่โครงสร้างต่างกันใน MySQL

INSERT INTO ... SELECT: คัดลอกข้อมูลข้ามตารางโครงสร้างต่างกัน

ระบุคอลัมน์ปลายทางตรงกับคอลัมน์ต้นทางตามลำดับ ชนิดข้อมูลต้องเข้ากันได้ (Compatible)

ตารางต้นทาง (DemoTable1)

mysql> CREATE TABLE DemoTable1 (
    -> PersonId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> PersonName VARCHAR(20),
    -> PersonAge INT,
    -> PersonCountryName VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.55 sec)

mysql> INSERT INTO DemoTable1(PersonName, PersonAge, PersonCountryName) VALUES
    -> ('Chris Brown', 24, 'US'),
    -> ('John Doe', 26, 'UK'),
    -> ('David Miller', 23, 'AUS');
Query OK, 3 rows affected

ตารางปลายทาง (DemoTable2) - โครงสร้างต่าง: มี EmployeeSalary Default

mysql> CREATE TABLE DemoTable2 (
    -> EmployeeId INT,
    -> EmployeeFullName VARCHAR(30),
    -> EmployeeAge INT,
    -> EmployeeCountryName VARCHAR(20),
    -> EmployeeSalary INT DEFAULT 20000
    -> );
Query OK, 0 rows affected (0.52 sec)

คำสั่ง INSERT INTO SELECT (Map คอลัมน์ 1-1)

mysql> INSERT INTO DemoTable2(EmployeeId, EmployeeFullName, EmployeeAge, EmployeeCountryName)
    -> SELECT PersonId, PersonName, PersonAge, PersonCountryName FROM DemoTable1;
Query OK, 3 rows affected (0.26 sec)
Records: 3  Duplicates: 0  Warnings: 0

ผลลัพธ์ในตารางปลายทาง (EmployeeSalary = Default 20000)

+------------+------------------+-------------+---------------------+----------------+
| EmployeeId | EmployeeFullName | EmployeeAge | EmployeeCountryName | EmployeeSalary |
+------------+------------------+-------------+---------------------+----------------+
|          1 | Chris Brown      |          24 | US                  |          20000 |
|          2 | John Doe         |          26 | UK                  |          20000 |
|          3 | David Miller     |          23 | AUS                 |          20000 |
+------------+------------------+-------------+---------------------+----------------+

จุดสำคัญ

  • จำนวนคอลัมน์ใน INSERT และ SELECT ต้องเท่ากัน
  • ลำดับคอลัมน์ต้องตรงกัน (Positional Mapping)
  • ชนิดข้อมูลต้อง Compatible (VARCHAR→VARCHAR, INT→INT, VARCHAR(20)→VARCHAR(30) OK)
  • คอลัมน์ที่ไม่ระบุใน INSERT จะได้ DEFAULT Value (EmployeeSalary = 20000)
  • AUTO_INCREMENT ของต้นทาง คัดลอกค่าไปเป็น INT ธรรมดาในปลายทาง

กรณี Map คอลัมน์ไม่ตรงลำดับ: ใช้ Alias ใน SELECT

INSERT INTO DemoTable2(EmployeeId, EmployeeFullName, EmployeeAge, EmployeeCountryName)
SELECT 
    PersonId AS EmployeeId,
    PersonName AS EmployeeFullName,
    PersonAge AS EmployeeAge,
    PersonCountryName AS EmployeeCountryName
FROM DemoTable1;

กรณี Transform ข้อมูลระหว่างทาง

INSERT INTO DemoTable2(EmployeeId, EmployeeFullName, EmployeeAge, EmployeeCountryName, EmployeeSalary)
SELECT 
    PersonId,
    CONCAT('EMP-', PersonName),
    PersonAge,
    UPPER(PersonCountryName),
    PersonAge * 1000  -- คำนวณ Salary จาก Age
FROM DemoTable1;