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

MySQL: INSERT với MAX() + 1 (tự tăng có điều kiện)

Để 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 = 1
  • 1 + ...: 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+).