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

วิธี INSERT ข้อมูลบางส่วนจากตารางหนึ่งไปอีกตารางใน MySQL คำสั่งเดียว

การ INSERT ข้อมูลจากตารางหนึ่งไปอีกตารางด้วย INSERT ... SELECT (มีเงื่อนไข)

ใช้ INSERT INTO target_table (cols) SELECT cols FROM source_table WHERE condition เพื่อคัดลอกข้อมูลบางส่วนในคำสั่งเดียว

รูปแบบคำสั่ง

INSERT INTO target_table (col1, col2, ...)
SELECT col1, col2, ... 
FROM source_table 
WHERE condition;

ตัวอย่าง: คัดลอกข้อมูลจาก DemoTable1 ไป DemoTable2 ยกเว้น Id=2

1. สร้างตารางต้นทางและเพิ่มข้อมูล

CREATE TABLE DemoTable1 (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name VARCHAR(40)
);

INSERT INTO DemoTable1 (Name) VALUES ('Chris'), ('David'), ('Bob');

2. สร้างตารางปลายทาง (โครงสร้างต่างกัน)

CREATE TABLE DemoTable2 (
    ClientId INT,
    ClientFirstName VARCHAR(20)
);

3. INSERT ... SELECT พร้อมเงื่อนไข WHERE Id != 2

INSERT INTO DemoTable2 (ClientId, ClientFirstName)
SELECT Id, Name FROM DemoTable1 WHERE Id != 2;

ผลลัพธ์การรัน: Query OK, 2 rows affected (0.17 sec) Records: 2 Duplicates: 0 Warnings: 0

4. ตรวจสอบตารางปลายทาง

SELECT * FROM DemoTable2;

ผลลัพธ์:

+----------+-----------------+
| ClientId | ClientFirstName |
+----------+-----------------+
| 1        | Chris           |
| 3        | Bob             |
+----------+-----------------+

Id=2 (David) ถูกยกเว้น ตามเงื่อนไข WHERE Id != 2

ข้อดีของ INSERT ... SELECT

  • Atomic: ทำงานใน Transaction เดียว
  • เร็วกว่า: ไม่ต้อง Round-trip ไป Application
  • Memory Efficient: ไม่ต้องโหลดข้อมูลไป Client
  • สามารถ Transform ข้อมูลได้: SELECT UPPER(Name), Id*100 ...

การจัดการ Column Mapping

-- ลำดับคอลัมน์ใน SELECT ต้องตรงกับ INSERT
INSERT INTO Target (A, B, C) SELECT X, Y, Z FROM Source;

-- ใช้ Alias เพื่อความชัดเจน
INSERT INTO Target (A, B, C) 
SELECT X AS A, Y AS B, Z AS C FROM Source;

กรณีมี AUTO_INCREMENT ใน Target

CREATE TABLE Target (Id INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(50));
INSERT INTO Target (Name) SELECT Name FROM Source;  -- ไม่ระบุ Id

ข้อควรระวัง

  • Data Type ต้องเข้ากันได้ (Implicit Conversion อาจเกิด Warning)
  • NOT NULL Constraint: ต้องให้ค่าทุกแถว
  • Unique/Duplicate Key: อาจ Error หากข้อมูลซ้ำ → ใช้ INSERT IGNORE หรือ ON DUPLICATE KEY UPDATE
  • Trigger บน Target จะทำงาน

คัดลอกโครงสร้าง + ข้อมูล (Clone Table)

CREATE TABLE NewTable AS SELECT * FROM OldTable WHERE Condition;