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

คัดลอกค่าคอลัมน์หนึ่งไปยังอีกตารางด้วย INSERT ... SELECT ใน MySQL

ภาพรวม

สามารถคัดลอกข้อมูลจากคอลัมน์ของตารางหนึ่งไปยังตารางอีกตารางได้ในคำสั่งเดียว โดยใช้ INSERT ... SELECT ไม่ต้องดึงข้อมูลออกมาก่อนแล้วค่อย Insert ใหม่

ไวยากรณ์

INSERT INTO target_table (target_column)
SELECT source_column
FROM source_table
[WHERE condition];

ตัวอย่างสมบูรณ์

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

CREATE TABLE DemoTable1 (
    Name VARCHAR(100),
    Gender ENUM('MALE', 'FEMALE')
);

INSERT INTO DemoTable1 VALUES ('Chris', 'Male');
INSERT INTO DemoTable1 VALUES ('Emma', 'Female');

2. สร้างตารางปลายทาง

CREATE TABLE DemoTable2 (
    EmployeeGender VARCHAR(100)
);

3. คัดลอกข้อมูลด้วยคำสั่งเดียว

INSERT INTO DemoTable2 (EmployeeGender)
SELECT Gender FROM DemoTable1;

4. ผลลัพธ์

SELECT * FROM DemoTable2;
+----------------+
| EmployeeGender |
+----------------+
| MALE           |
| FEMALE         |
+----------------+

การประยุกต์ใช้เพิ่มเติม

คัดลอกหลายคอลัมน์พร้อมกัน

INSERT INTO TargetTable (col1, col2, col3)
SELECT colA, colB, colC
FROM SourceTable;

คัดลอกพร้อมเปลี่ยนชื่อคอลัมน์/คำนวณค่า

INSERT INTO TargetTable (full_name, age_group)
SELECT CONCAT(first_name, ' ', last_name),
       CASE 
           WHEN age < 18 THEN 'Minor'
           WHEN age < 60 THEN 'Adult'
           ELSE 'Senior'
       END
FROM SourceTable;

คัดลอกพร้อมเงื่อนไข WHERE

INSERT INTO ActiveUsers (user_id, email)
SELECT id, email
FROM Users
WHERE status = 'active' AND last_login > DATE_SUB(NOW(), INTERVAL 30 DAY);

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

  • Atomic - ทำงานใน Transaction เดียว
  • ประสิทธิภาพสูง - ไม่ต้อง Round-trip ระหว่าง Application และ DB
  • รองรับ WHERE, JOIN, FUNCTION - กรอง/แปลงข้อมูลระหว่างทางได้
  • หลีกเลี่ยง Race Condition - ข้อมูลไม่เปลี่ยนระหว่าง Select และ Insert

ข้อควรระวัง

  • Data Type ของคอลัมน์ต้นทางและปลายทางต้องเข้ากันได้
  • ถ้ามี PRIMARY KEY หรือ UNIQUE KEY ในตารางปลายทาง อาจเกิด Duplicate Key Error
  • ใช้ INSERT IGNORE หรือ ON DUPLICATE KEY UPDATE เพื่อจัดการข้อมูลซ้ำ