คำอธิบาย
ใช้ User-defined Variable (@row) ร่วมกับ CONCAT() เพื่ออัปเดตค่าคอลัมน์ให้มีตัวเลขต่อท้ายแบบลำดับ (1, 2, 3...)
ขั้นตอนการสร้างตารางและข้อมูลตัวอย่าง
mysql> create table DemoTable (
StudentId varchar(80) );
Query OK, 0 rows affected (0.50 sec)
การเพิ่มข้อมูล (ชื่อซ้ำทั้งหมด)
mysql> insert into DemoTable values('John');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('John');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values('John');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable values('John');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable values('John');
Query OK, 1 row affected (0.08 sec)
แสดงข้อมูลก่อนอัปเดต
mysql> select * from DemoTable;
ผลลัพธ์:
+-----------+ | StudentId | +-----------+ | John | | John | | John | | John | | John | +-----------+ 5 rows in set (0.00 sec)
คิวรี่ UPDATE พร้อมตัวแปร @row
mysql> update DemoTable, (select @row := 0) r
set StudentId = concat('John', @row := @row + 1);
ผลลัพธ์: Query OK, 5 rows affected (0.11 sec)
ตรวจสอบข้อมูลหลังอัปเดต
mysql> select * from DemoTable;
ผลลัพธ์:
+-----------+ | StudentId | +-----------+ | John1 | | John2 | | John3 | | John4 | | John5 | +-----------+ 5 rows in set (0.00 sec)
คำอธิบายการทำงาน
(select @row := 0) r: สร้างตารางชั่วคราว (Derived table) ที่มีตัวแปร @row เริ่มต้นที่ 0@row := @row + 1: เพิ่มค่า @row ทีละ 1 สำหรับแต่ละแถวCONCAT('John', @row := @row + 1): รวมสตริง 'John' กับค่า @row ใหม่- MySQL ประมวลผลแถวตามลำดับที่เก็บไว้ (โดยปกติเป็น Primary Key order)
ข้อควรระวัง
- ลำดับอาจไม่แน่นอนหากไม่มี ORDER BY ใน Subquery
- แนะนำให้ใช้:
UPDATE DemoTable JOIN (SELECT @row := 0) r SET ... ORDER BY Id(MySQL 8.0+ รองรับ ORDER BY ใน UPDATE)