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

INSERT INTO SELECT ลงตารางที่มี AUTO_INCREMENT ใน MySQL

สามารถใช้ INSERT INTO ... SELECT ลงตารางที่มี AUTO_INCREMENT Primary Key ได้ โดยระบุค่า PK เอง (Override) หรือปล่อยให้ Auto Generate

ตัวอย่าง: ระบุค่า UserId เอง (Override Auto Increment)

1. สร้างตารางมี AUTO_INCREMENT

mysql> create table DemoTable1923 ( 
    -> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    -> UserName varchar(20) 
    -> ); Query OK, 0 rows affected (0.00 sec)

2. INSERT INTO SELECT พร้อมระบุ UserId

mysql> insert into DemoTable1923(UserId, UserName) 
    -> select 101 as UserId, 'Chris' as UserName; 
Query OK, 1 row affected (0.00 sec) Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into DemoTable1923(UserId, UserName) 
    -> select 102 as UserId, 'Robert' as UserName; 
Query OK, 1 row affected (0.00 sec) Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into DemoTable1923(UserId, UserName) 
    -> select 103 as UserId, 'Sam' as UserName; 
Query OK, 1 row affected (0.00 sec) Records: 1  Duplicates: 0  Warnings: 0

3. ตรวจสอบผลลัพธ์

mysql> select * from DemoTable1923;
+--------+----------+
| UserId | UserName |
+--------+----------+
|    101 | Chris    |
|    102 | Robert   |
|    103 | Sam      |
+--------+----------+
3 rows in set (0.00 sec)

กรณี: ไม่ระบุ PK ให้ Auto Generate

INSERT INTO DemoTable1923(UserName) 
SELECT 'NewUser' FROM DUAL;  -- หรือ SELECT 'NewUser' LIMIT 1

-- หรือจากตารางอื่น
INSERT INTO DemoTable1923(UserName) 
SELECT ClientName FROM DemoTable1900;

ข้อควรระวังกับ AUTO_INCREMENT

  • ถ้าระบุค่า PK เอง ค่าต้องไม่ซ้ำ (Unique)
  • ค่า Auto Increment ตัวถัดไปจะเป็น MAX(PK) + 1 ไม่สนใจค่าที่ Insert แบบ Manual
  • ใช้ ALTER TABLE t AUTO_INCREMENT = 1000 รีเซ็ตค่าเริ่มต้น

คัดลอกข้อมูลระหว่างตารางที่มี AUTO_INCREMENT

-- ตารางปลายทางมี AUTO_INCREMENT ใหม่
INSERT INTO target_table (name, email) 
SELECT name, email FROM source_table;  -- target_id จะ Auto Generate

-- ต้องการเก็บ ID เดิม
INSERT INTO target_table (id, name, email) 
SELECT id, name, email FROM source_table;  -- ต้องปิด FK Check ถ้ามี Duplicate

สรุป: INSERT INTO ... SELECT ลงตาราง AUTO_INCREMENT ได้ทั้งระบุ PK เอง (Override) หรือปล่อย Auto Generate โดยละคอลัมน์ PK ออกจาก Column List