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

การทำ Nested INSERT with SELECT ใน MySQL

สามารถทำ 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);