MyISAM không hỗ trợ hành vi này. Tạo khóa chính hai cột và tạo khóa thứ hai cột tự động tăng. Nó sẽ bắt đầu lại cho từng giá trị riêng biệt trong cột đầu tiên.
CREATE TABLE t (i INT, j INT AUTO_INCREMENT, PRIMARY KEY (i,j)) ENGINE=MyISAM;
INSERT INTO t (i) VALUES (1), (1), (2), (2), (1), (3);
SELECT * FROM t;
+---+---+
| i | j |
+---+---+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
+---+---+
Nhưng nếu bạn nghĩ về nó, điều này chỉ an toàn trong một công cụ lưu trữ thực hiện khóa cấp bảng cho các câu lệnh INSERT. Vì INSERT phải tìm kiếm các hàng khác trong bảng để tìm j
max giá trị trên cùng một i
giá trị. Nếu những người khác đang thực hiện INSERT đồng thời, nó sẽ tạo ra một điều kiện chạy đua.
Do đó, sự phụ thuộc vào MyISAM, khóa cấp bảng trên INSERT.
Xem tài liệu tham khảo này trong sách hướng dẫn: http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html trong phần, Ghi chú MyISAM .
Có rất nhiều lý do chính đáng để không sử dụng MyISAM. Yếu tố quyết định đối với tôi là xu hướng làm hỏng dữ liệu của MyISAM.
Nhận xét lại của bạn:
InnoDB không hỗ trợ hành vi gia tăng cho mỗi nhóm được mô tả ở trên. Bạn có thể tạo khóa chính nhiều cột, nhưng lỗi bạn gặp phải là do InnoDB yêu cầu cột tăng tự động phải là cột đầu tiên trong khóa của bảng (không nhất thiết phải là khóa chính)
Bất kể vị trí của cột tự động tăng trong khóa nhiều cột, nó chỉ tăng khi bạn sử dụng nó với InnoDB; nó không đánh số các mục nhập cho mỗi giá trị riêng biệt trong một cột khác.
Để thực hiện điều này với bảng InnoDB, bạn phải khóa bảng một cách rõ ràng trong suốt thời gian INSERT, để tránh các điều kiện về chủng tộc. Bạn sẽ thực hiện truy vấn CHỌN của riêng mình cho giá trị tối đa trong nhóm mà bạn đang chèn vào. Sau đó, chèn giá trị đó + 1.
Về cơ bản, bạn phải bỏ qua tính năng tự động tăng và chỉ định các giá trị thay vì để chúng được tạo tự động.