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;