Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Dịch chuyển giá trị ID hàng loạt trong MySQL (shift ID values)

Giới thiệu

Cập nhật cột khóa chính (hoặc cột ID) bằng cách cộng thêm một giá trị cố định để dời dải giá trị, ví dụ khi merge dữ liệu, reserve ID range.

1. Tạo bảng và dữ liệu

mysql> create table DemoTable (
    -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName varchar(20)
    -> ); 
Query OK, 0 rows affected (1.07 sec)

mysql> insert into DemoTable(StudentName) values('Chris'); 
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable(StudentName) values('Robert'); 
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentName) values('David'); 
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(StudentName) values('Mike'); 
Query OK, 1 row affected (0.10 sec)

2. Dữ liệu gốc

mysql> select *from DemoTable;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | Chris       |
|         2 | Robert      |
|         3 | David       |
|         4 | Mike        |
+-----------+-------------+
4 rows in set (0.00 sec)

3. Dịch chuyển ID (+1000)

mysql> update DemoTable set StudentId = StudentId + 1000; 
Query OK, 4 rows affected (0.18 sec)
Rows matched: 4 Changed: 4 Warnings: 0

4. Kết quả

mysql> select *from DemoTable;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|      1001 | Chris       |
|      1002 | Robert      |
|      1003 | David       |
|      1004 | Mike        |
+-----------+-------------+
4 rows in set (0.00 sec)

⚠️ Lưu ý quan trọng:

  • Nếu StudentId là PRIMARY KEY hoặc có FOREIGN KEY tham chiếu, UPDATE có thể thất bại do ràng buộc khóa
  • Cần tắt kiểm tra khóa ngoại tạm thời: SET FOREIGN_KEY_CHECKS = 0; (rất nguy hiểm, chỉ dùng khi hiểu rõ)
  • Auto-increment counter không tự động cập nhật → lần INSERT tiếp theo sẽ tạo ID = 5 (không phải 1005). Cần reset: ALTER TABLE DemoTable AUTO_INCREMENT = 1005;

Cách an toàn hơn (tạo bảng mới):

CREATE TABLE new_table AS 
SELECT StudentId + 1000 AS StudentId, StudentName FROM DemoTable;
-- Sau đó rename, thêm PK, FK...