สามารถทำ INSERT ... SELECT แบบ Nested ได้ คือ Insert ข้อมูลจากตารางหนึ่งเข้าไปอีกตารางหนึ่งพร้อมกรองเงื่อนไข
รูปแบบคำสั่ง (Syntax)
insert into yourTableName2(yourColumnName1,yourColumnName2,.....N) select yourColumnName1,yourColumnName2,....N from yourTableName1 where yourCondition;
สร้างตารางแรก
mysql> create table DemoTable1 (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(40) );
Query OK, 0 rows affected (0.88 sec)
เพิ่มข้อมูลตารางแรก
mysql> insert into DemoTable1(Name) values('Chris'); Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1(Name) values('David'); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1(Name) values('Bob'); Query OK, 1 row affected (0.12 sec)
สร้างตารางที่สอง
mysql> create table DemoTable2 (
ClientId int,
ClientFirstName varchar(20) );
Query OK, 0 rows affected (0.60 sec)
คิวรี่ Nested INSERT SELECT
mysql> 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
แสดงข้อมูลตารางที่สอง
mysql> select *from DemoTable2;
+----------+-----------------+ | ClientId | ClientFirstName | +----------+-----------------+ | 1 | Chris | | 3 | Bob | +----------+-----------------+ 2 rows in set (0.00 sec)
จุดสำคัญ
- จำนวนและลำดับคอลัมน์ใน INSERT และ SELECT ต้องตรงกัน
- ชนิดข้อมูลต้องเข้ากันได้
- สามารถใช้ WHERE, JOIN, GROUP BY, ORDER BY, LIMIT ใน SELECT ได้
AUTO_INCREMENTในตารางปลายทางจะทำงานอัตโนมัติหากไม่ระบุค่า
กรณี Copy ตารางทั้งหมด
-- Copy โครงสร้าง + ข้อมูล CREATE TABLE new_table AS SELECT * FROM old_table; -- Copy แค่โครงสร้าง CREATE TABLE new_table LIKE old_table;
INSERT IGNORE / REPLACE / ON DUPLICATE KEY UPDATE
-- ข้ามแถวที่ทำให้ Duplicate Key INSERT IGNORE INTO target SELECT * FROM source; -- แทนที่แถวเก่า (DELETE + INSERT) REPLACE INTO target SELECT * FROM source; -- อัปเดตเมื่อ Duplicate Key INSERT INTO target SELECT * FROM source ON DUPLICATE KEY UPDATE col1 = VALUES(col1);