บทนำ
คำสั่ง INSERT INTO ... SELECT ใช้คัดลอกข้อมูลจากตารางหนึ่งไปอีกตารางหนึ่งในคำสั่งเดียว ต้องระวังลำดับคอลัมน์และจำนวนคอลัมน์ให้ตรงกัน
ตัวอย่าง: คัดลอกจาก DemoTable1 ไป DemoTable2
1. สร้างตารางต้นทาง (DemoTable1)
mysql> CREATE TABLE DemoTable1 (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstName VARCHAR(100)
-> );
Query OK, 0 rows affected (0.57 sec)
mysql> INSERT INTO DemoTable1(FirstName) VALUES('John');
mysql> INSERT INTO DemoTable1(FirstName) VALUES('Chris');
mysql> SELECT * FROM DemoTable1;
+----+-----------+
| Id | FirstName |
+----+-----------+
| 1 | John |
| 2 | Chris |
+----+-----------+
2. สร้างตารางปลายทาง (DemoTable2)
mysql> CREATE TABLE DemoTable2 (
-> CustomerId INT,
-> CustomerName VARCHAR(100)
-> );
Query OK, 0 rows affected (0.43 sec)
3. คัดลอกข้อมูลด้วย INSERT INTO SELECT
mysql> INSERT INTO DemoTable2(CustomerId, CustomerName)
-> SELECT Id, FirstName FROM DemoTable1;
Query OK, 2 rows affected (0.17 sec)
Records: 2 Duplicates: 0 Warnings: 0
4. ตรวจสอบผลลัพธ์
mysql> SELECT * FROM DemoTable2;
+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
| 1 | John |
| 2 | Chris |
+------------+--------------+
2 rows in set (0.00 sec)
กฎสำคัญเพื่อหลีกเลี่ยง Error 1064
- ลำดับคอลัมน์ ใน INSERT INTO และ SELECT ต้องตรงกันทุกคอลัมน์
- จำนวนคอลัมน์ ต้องเท่ากัน
- ชนิดข้อมูล ต้องเข้ากันได้ (Compatible Types)
- ระบุชื่อคอลัมน์ ใน INSERT INTO เสมอ (Best Practice)
ตัวอย่างที่ผิด (Error 1064)
-- ผิด: จำนวนคอลัมน์ไม่ตรง
INSERT INTO DemoTable2(CustomerId) SELECT Id, FirstName FROM DemoTable1;
-- ผิด: ลำดับสลับ
INSERT INTO DemoTable2(CustomerId, CustomerName) SELECT FirstName, Id FROM DemoTable1;
คำสั่งที่มี WHERE และ JOIN
-- คัดลอกเฉพาะข้อมูลที่ตรงเงื่อนไข
INSERT INTO DemoTable2(CustomerId, CustomerName)
SELECT Id, FirstName FROM DemoTable1 WHERE Id > 1;
-- คัดลอกจากหลายตาราง (JOIN)
INSERT INTO SummaryTable(UserId, UserName, OrderCount)
SELECT u.Id, u.Name, COUNT(o.Id)
FROM Users u
LEFT JOIN Orders o ON u.Id = o.UserId
GROUP BY u.Id, u.Name;