Vấn đề: Chèn dữ liệu vào bảng có khóa chính AUTO_INCREMENT từ SELECT
Cần chèn hàng vào bảng có cột UserId AUTO_INCREMENT, nhưng vẫn muốn kiểm soát giá trị ID (hoặc để tự động sinh).
Giải pháp: INSERT INTO ... SELECT với danh sách cột
Chỉ định cột đích (kể cả cột AUTO_INCREMENT nếu muốn gán giá trị cụ thể).
1. Tạo bảng
CREATE TABLE DemoTable (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
UserName VARCHAR(20)
);
2. Chèn với chỉ định UserId (ghi đè AUTO_INCREMENT)
INSERT INTO DemoTable (UserId, UserName)
SELECT 101 AS UserId, 'Chris' AS UserName;
INSERT INTO DemoTable (UserId, UserName)
SELECT 102 AS UserId, 'Robert' AS UserName;
INSERT INTO DemoTable (UserId, UserName)
SELECT 103 AS UserId, 'Sam' AS UserName;
3. Kết quả
+--------+----------+
| UserId | UserName |
+--------+----------+
| 101 | Chris |
| 102 | Robert |
| 103 | Sam |
+--------+----------+
Lưu ý quan trọng
- Nếu không chỉ định
UserIdtrong danh sách cột, MySQL sẽ tự động sinh giá trị AUTO_INCREMENT (bỏ qua giá trị trong SELECT). - Nếu có chỉ định
UserId, giá trị trong SELECT sẽ được dùng (phải duy nhất, không trùng khóa chính). - Sau khi chèn giá trị lớn (103), lần INSERT sau không chỉ định UserId sẽ sinh từ 104.
- Cần quyền
INSERTvà (nếu ghi đè AUTO_INCREMENT) thường cần quyềnSUPERhoặc cấu hìnhauto_increment_offset/increment.
Ví dụ: Chèn từ bảng khác, để AUTO_INCREMENT tự sinh
INSERT INTO DemoTable (UserName)
SELECT ClientName FROM SourceTable;
MySQL sẽ tự gán UserId = 104, 105, ...