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

ใช้ INSERT INTO ... SELECT ใน MySQL ให้ถูกต้อง หลีกเลี่ยง Error 1064

บทนำ

คำสั่ง 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

  1. ลำดับคอลัมน์ ใน INSERT INTO และ SELECT ต้องตรงกันทุกคอลัมน์
  2. จำนวนคอลัมน์ ต้องเท่ากัน
  3. ชนิดข้อมูล ต้องเข้ากันได้ (Compatible Types)
  4. ระบุชื่อคอลัมน์ ใน 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;