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

MySQL: นำข้อมูลจาก Query Result ไปสร้างตารางใหม่ (INSERT SELECT)

การสร้างตารางใหม่และเติมข้อมูลจากผลลัพธ์ของ SELECT query สามารถทำได้ด้วยคำสั่ง INSERT ... SELECT หรือ CREATE TABLE ... AS SELECT

วิธีที่ 1: INSERT INTO ... SELECT (ตารางปลายทางมีอยู่แล้ว)

INSERT INTO target_table (col1, col2, col3)
SELECT col1, col2, col3
FROM source_table;
  • ตารางปลายทางต้องมีอยู่แล้ว
  • จำนวนและลำดับคอลัมน์ต้องตรงกัน
  • ชนิดข้อมูลต้องเข้ากันได้

วิธีที่ 2: CREATE TABLE ... AS SELECT (CTAS) - สร้างตารางใหม่พร้อมข้อมูล

CREATE TABLE new_table AS
SELECT col1, col2, col3
FROM source_table;
  • สร้างตารางใหม่พร้อมโครงสร้างและข้อมูลในคำสั่งเดียว
  • ไม่คัดลอก Index, Primary Key, Auto Increment, Constraints, Triggers
  • ใช้ CREATE TABLE new_table LIKE source_table ก่อน แล้ว INSERT SELECT หากต้องการโครงสร้างเหมือนกัน

ตัวอย่างการใช้งาน

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

CREATE TABLE PopulateTableDemo (
    Id INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(20),
    Amount INT,
    ArrivalDateTime DATETIME,
    PRIMARY KEY (Id)
);

INSERT INTO PopulateTableDemo (Name, Amount, ArrivalDateTime) VALUES
('John', 456, '2018-02-04'),
('Carol', 1000, '2019-10-21'),
('Sam', 970, '2019-07-25'),
('Larry', 1050, '2015-10-28');

ข้อมูลต้นทาง:

+----+-------+--------+---------------------+
| Id | Name  | Amount | ArrivalDateTime     |
+----+-------+--------+---------------------+
|  1 | John  |    456 | 2018-02-04 00:00:00 |
|  2 | Carol |   1000 | 2019-10-21 00:00:00 |
|  3 | Sam   |    970 | 2019-07-25 00:00:00 |
|  4 | Larry |   1050 | 2015-10-28 00:00:00 |
+----+-------+--------+---------------------+

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

CREATE TABLE PopulateQueryFromAnotherTable (
    Id INT NOT NULL AUTO_INCREMENT,
    UserName VARCHAR(20),
    Salary INT,
    DepartureDateTime DATETIME,
    PRIMARY KEY (Id)
);

3. คัดลอกข้อมูล (Mapping คอลัมน์)

INSERT INTO PopulateQueryFromAnotherTable (UserName, Salary, DepartureDateTime)
SELECT Name, Amount, ArrivalDateTime
FROM PopulateTableDemo;

ผลลัพธ์: Query OK, 4 rows affected

4. ตรวจสอบข้อมูลในตารางปลายทาง

SELECT * FROM PopulateQueryFromAnotherTable;
+----+----------+--------+---------------------+
| Id | UserName | Salary | DepartureDateTime   |
+----+----------+--------+---------------------+
|  1 | John     |    456 | 2018-02-04 00:00:00 |
|  2 | Carol    |   1000 | 2019-10-21 00:00:00 |
|  3 | Sam      |    970 | 2019-07-25 00:00:00 |
|  4 | Larry    |   1050 | 2015-10-28 00:00:00 |
+----+----------+--------+---------------------+

เทคนิคเพิ่มเติม

คัดลอกเฉพาะบางเงื่อนไข

INSERT INTO target (col1, col2)
SELECT col1, col2 FROM source WHERE status = 'active';

คำนวณค่าใหม่ระหว่างคัดลอก

INSERT INTO target (name, total_price)
SELECT name, price * qty FROM source;

ใช้ฟังก์ชันแปลงข้อมูล

INSERT INTO target (name, created_date)
SELECT UPPER(name), DATE(created_at) FROM source;

สรุปการเลือกวิธี

สถานการณ์คำสั่งแนะนำ
ตารางปลายทางมีอยู่แล้ว, โครงสร้างต่างกันINSERT INTO ... SELECT
ต้องการสร้างตารางใหม่ด่วน, ไม่ต้องการ Index/PKCREATE TABLE ... AS SELECT
ต้องการโครงสร้างเหมือนกันทุกอย่าง (PK, Index, AI)CREATE TABLE ... LIKE + INSERT SELECT