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

MySQL: UPDATE คอลัมน์ให้เป็นค่าต่อเนื่อง John1, John2, John3... ด้วย Variable


คำอธิบาย

ใช้ 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)

คำอธิบายการทำงาน

  1. (select @row := 0) r: สร้างตารางชั่วคราว (Derived table) ที่มีตัวแปร @row เริ่มต้นที่ 0
  2. @row := @row + 1: เพิ่มค่า @row ทีละ 1 สำหรับแต่ละแถว
  3. CONCAT('John', @row := @row + 1): รวมสตริง 'John' กับค่า @row ใหม่
  4. MySQL ประมวลผลแถวตามลำดับที่เก็บไว้ (โดยปกติเป็น Primary Key order)

ข้อควรระวัง

  • ลำดับอาจไม่แน่นอนหากไม่มี ORDER BY ใน Subquery
  • แนะนำให้ใช้: UPDATE DemoTable JOIN (SELECT @row := 0) r SET ... ORDER BY Id (MySQL 8.0+ รองรับ ORDER BY ใน UPDATE)