Để chèn bản ghi mới với ID = MAX(ID hiện tại theo điều kiện) + 1, dùng COALESCE xử lý trường hợp bảng rỗng (MAX trả về NULL).
Cú pháp
INSERT INTO ten_bang (cot_id, cot_khac) SELECT 1 + COALESCE((SELECT MAX(cot_id) FROM ten_bang WHERE cot_dieu_kien = 'gia_tri'), 0), 'gia_tri';
Ví dụ minh họa
Tạo bảng (Id không phải AUTO_INCREMENT):
mysql> CREATE TABLE InsertMaxPlus1Demo (
-> Id INT,
-> Ten VARCHAR(20)
-> );
Chèn dữ liệu ban đầu (John có Id max = 3):
mysql> INSERT INTO InsertMaxPlus1Demo(Id, Ten) VALUES
-> (1, 'John'), (1, 'Mike'), (2, 'John'), (1, 'Larry'), (3, 'John'), (2, 'David');
Dữ liệu:
+------+-------+ | Id | Ten | +------+-------+ | 1 | John | | 1 | Mike | | 2 | John | | 1 | Larry | | 3 | John | | 2 | David | +------+-------+
Chèn John mới với Id = MAX(Id của John) + 1 = 4
mysql> INSERT INTO InsertMaxPlus1Demo (Id, Ten)
-> SELECT 1 + COALESCE((SELECT MAX(Id) FROM InsertMaxPlus1Demo WHERE Ten = 'John'), 0), 'John';
Kết quả:
+------+-------+ | Id | Ten | +------+-------+ | 1 | John | | 1 | Mike | | 2 | John | | 1 | Larry | | 3 | John | | 2 | David | | 4 | John | -- bản ghi mới +------+-------+
Giải thích:
COALESCE(..., 0): Nếu subquery trả NULL (chưa có John), dùng 0 → Id = 11 + ...: Tăng thêm 1- Phù hợp cho hệ thống phân phối ID theo nhóm (tenant, user, category)
Cảnh báo: Không an toàn cho môi trường đồng thời (concurrency). Nên dùng AUTO_INCREMENT hoặc SEQUENCE (MySQL 8.0+).