Tự động tăng là một tính năng hữu ích được cung cấp bởi MySQL. Nó luôn tạo ra một danh tính duy nhất cho mỗi hàng mới được chèn vào bảng. Nói chung, chúng tôi sử dụng thuộc tính tăng tự động cho trường khóa chính trong bảng. Mỗi lần chúng ta chèn các bản ghi mới vào một bảng, MySQL sẽ tự động tăng giá trị vào cột tăng tự động
Ví dụ: chúng tôi có một bảng đã chứa mười hàng. Tiếp theo, nếu chúng ta thêm một hàng mới mà không đưa giá trị vào cột tăng tự động, MySQL sẽ tự động thêm một hàng mới với id=11
Đôi khi, chúng ta cần xóa các hàng này và đặt lại cột tăng tự động để khi chúng ta thực hiện lần chèn tiếp theo vào bảng, danh tính của bản ghi đầu tiên sẽ có giá trị khóa chính là 1
MySQL cho phép nhiều cách khác nhau để đặt lại giá trị cột tăng tự động. Những cách này là
- Sử dụng câu lệnh ALTER TABLE
- Sử dụng câu lệnh TRUNCATE TABLE
- Sử dụng một cặp câu lệnh DROP TABLE và CREATE TABLE
Đầu tiên, chúng ta sẽ tạo một bảng có tên là "Động vật" và gán cột id với thuộc tính tự động tăng. Xem tuyên bố dưới đây
Tiếp theo, chúng ta sẽ chèn một số dữ liệu mẫu vào bảng "Động vật" như sau
Bây giờ, chúng tôi sẽ thực hiện câu lệnh dưới đây để xác minh thao tác chèn
Chúng ta sẽ nhận được đầu ra dưới đây. Trong câu lệnh chèn, chúng tôi chưa chỉ định bất kỳ giá trị nào cho cột tăng tự động. Nhưng chúng ta có thể quan sát thấy ở đầu ra rằng MySQL tự động tạo một số duy nhất theo thứ tự cho trường này
Hãy để chúng tôi lấy bảng này để minh họa các phương pháp đặt lại giá trị cột tăng tự động một cách chi tiết
Sử dụng câu lệnh ALTER TABLE
Câu lệnh ALTER TABLE được sử dụng để thay đổi tên của bảng hoặc bất kỳ trường nào của bảng. Nó cũng được sử dụng để thêm, xóa hoặc đặt lại một cột hiện có trong bảng. MySQL cũng cho phép câu lệnh này đặt lại giá trị cột tăng tự động bất cứ khi nào chúng tôi muốn
cú pháp
Sau đây là cú pháp của câu lệnh ALTER TABLE để đặt lại giá trị cột tự động tăng
Trong cú pháp này, trước tiên chúng tôi đã chỉ định tên của bảng sau mệnh đề ALTER TABLE. Tiếp theo, chúng tôi chỉ định giá trị mà chúng tôi muốn đặt lại trong biểu thức là AUTO_INCREMENT = value
Cần lưu ý rằng MySQL không cho phép đặt lại giá trị nhỏ hơn hoặc bằng giá trị đã được sử dụng. Ví dụ: nếu chúng tôi đang sử dụng InnoDB, giá trị không được nhỏ hơn hoặc bằng giá trị tối đa hiện tại của cột tăng tự động
Đối với MyISAM, nếu giá trị được chỉ định nhỏ hơn hoặc bằng giá trị tối đa của cột auto_increment, thì giá trị đó sẽ được đặt lại về giá trị tối đa hiện tại cộng với một
Đối với InnoDB, nếu giá trị được chỉ định nhỏ hơn giá trị tối đa hiện tại của cột auto_increment, MySQL sẽ không phát sinh bất kỳ lỗi nào và trình tự hiện tại cũng không thay đổi
Hãy xóa hàng thấp nhất trong bảng với id = 6 như bên dưới
Nếu chúng ta thêm một bản ghi mới, MySQL sẽ gán bản ghi này với id = 7. Nhưng nếu chúng ta muốn đặt lại cột này về giá trị cuối cùng, chúng ta có thể sử dụng câu lệnh ALTER TABLE như sau
Nếu chúng ta chèn các bản ghi mới vào bảng này, MySQL sẽ bắt đầu tạo id hàng với 6. Thực hiện truy vấn dưới đây
Cuối cùng, truy vấn dữ liệu trong bảng để xem hiệu quả. Đầu ra bên dưới giải thích rõ ràng hơn khi chúng ta có sáu hàng với giá trị gia tăng tự động cuối cùng là 6 thay vì 7
Sử dụng câu lệnh TRUNCATE TABLE
Câu lệnh TRUNCATE TABLE trong MySQL xóa hoàn toàn dữ liệu của bảng mà không xóa cấu trúc của bảng và luôn đặt lại giá trị cột tăng tự động về 0
cú pháp
Cú pháp sau minh họa câu lệnh TRUNCATE TABLE để đặt lại giá trị cột tự động tăng
Cần lưu ý rằng chúng ta không thể khôi phục dữ liệu đã xóa khỏi bảng sau khi thực hiện câu lệnh TRUNCATE TABLE
Sử dụng câu lệnh DROP TABLE và CREATE TABLE
Chúng ta cũng có thể đặt lại giá trị cột tăng tự động bằng cách sử dụng một cặp câu lệnh DROP TABLE và CREATE TABLE. Phương pháp này xóa vĩnh viễn các bản ghi hoàn chỉnh khỏi bảng
Tương tự như truy vấn TRUNCATE TABLE, cặp câu lệnh DROP TABLE và CREATE TABLE trước tiên xóa bảng rồi tạo lại bảng. Do đó, MySQL đặt lại giá trị cột tăng tự động thành 0
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 cung cấp cơ chế khóa có thể định cấu hình có thể cải thiện đáng kể khả năng mở rộng và hiệu suất của các câu lệnh SQL bổ sung hàng vào bảng có cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2. Để sử dụng cơ chế
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2 với bảng
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1, cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2 phải được xác định là cột đầu tiên hoặc cột duy nhất của một số chỉ mục sao cho có thể thực hiện tương đương với tra cứu
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;6] được lập chỉ mục trên bảng để có được giá trị cột lớn nhất. Chỉ mục không bắt buộc phải là
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;7 hoặc
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;8, nhưng để tránh các giá trị trùng lặp trong cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2, nên sử dụng các loại chỉ mục đó
Phần này mô tả các chế độ khóa
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2, ý nghĩa sử dụng của các cài đặt chế độ khóa
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2 khác nhau và cách
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 khởi tạo bộ đếm
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2
Chế độ khóa AUTO_INCREMENT của InnoDB
Phần này mô tả các chế độ khóa
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2 được sử dụng để tạo các giá trị tăng tự động và mỗi chế độ khóa ảnh hưởng đến sao chép như thế nào. Chế độ khóa tăng tự động được định cấu hình khi khởi động bằng biến
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;45
Các thuật ngữ sau được sử dụng để mô tả cài đặt
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;45
Câu nói “
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47-like”Tất cả các câu lệnh tạo ra các hàng mới trong một bảng, bao gồm
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47,CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
49,CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
90,CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
91 vàCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
92. Bao gồm "chèn đơn giản", "chèn số lượng lớn" và "chèn ở chế độ hỗn hợp"“Chèn đơn giản”
Các câu lệnh có thể xác định trước số lượng hàng được chèn vào [khi câu lệnh được xử lý ban đầu]. Điều này bao gồm các câu lệnh một hàng và nhiều hàng
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 vàCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
90 không có truy vấn con lồng nhau, nhưng không phải làCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
95“Chèn số lượng lớn”
Các câu lệnh không biết trước số lượng hàng sẽ được chèn [và số lượng giá trị tăng tự động bắt buộc]. Điều này bao gồm các câu lệnh
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
49,CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
91 vàCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
92, nhưng không phải làCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 đơn giản.CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
1 chỉ định từng giá trị mới cho cộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 khi mỗi hàng được xử lý“Phụ trang chế độ hỗn hợp”
Đây là các câu lệnh "chèn đơn giản" chỉ định giá trị tăng tự động cho một số [chứ không phải tất cả] các hàng mới. Một ví dụ sau, trong đó
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
12 là một cộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 của bảngCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
14CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
4Một loại “chèn chế độ hỗn hợp” khác là
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
95, trong trường hợp xấu nhất có hiệu lực là mộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 theo sau là mộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
17, trong đó giá trị được phân bổ cho cộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 có thể được sử dụng hoặc không trong giai đoạn cập nhật
Có ba cài đặt khả thi cho biến
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;45. Các cài đặt lần lượt là 0, 1 hoặc 2 cho chế độ khóa “truyền thống”, “liên tiếp” hoặc “xen kẽ”. Kể từ MySQL 8. 0, chế độ khóa xen kẽ [
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;00] là cài đặt mặc định. Trước MySQL 8. 0, chế độ khóa liên tục là mặc định [
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;01]
Cài đặt mặc định của chế độ khóa xen kẽ trong MySQL 8. 0 phản ánh sự thay đổi từ sao chép dựa trên câu lệnh sang sao chép dựa trên hàng làm loại sao chép mặc định. Sao chép dựa trên câu lệnh yêu cầu chế độ khóa tăng tự động liên tiếp để đảm bảo rằng các giá trị tăng tự động được gán theo thứ tự có thể dự đoán và lặp lại cho một chuỗi câu lệnh SQL nhất định, trong khi sao chép dựa trên hàng không nhạy cảm với thứ tự thực thi của câu lệnh SQL
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
02 [chế độ khóa [“truyền thống”]Chế độ khóa truyền thống cung cấp hành vi giống như đã tồn tại trước khi biến
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
45 được giới thiệu. Tùy chọn chế độ khóa truyền thống được cung cấp để tương thích ngược, kiểm tra hiệu suất và khắc phục sự cố với "chèn chế độ hỗn hợp", do có thể có sự khác biệt về ngữ nghĩaTrong chế độ khóa này, tất cả các câu lệnh “giống như CHÈN” đều có khóa
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 cấp bảng đặc biệt để chèn vào các bảng có cộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2. Khóa này thường được giữ ở cuối câu lệnh [không phải ở cuối giao dịch] để đảm bảo rằng các giá trị tăng tự động được gán theo thứ tự có thể dự đoán và lặp lại cho một chuỗi các câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 nhất định và để đảm bảo rằng giá trị tăng tự độngTrong trường hợp sao chép dựa trên câu lệnh, điều này có nghĩa là khi một câu lệnh SQL được sao chép trên máy chủ sao chép, các giá trị tương tự được sử dụng cho cột tăng tự động như trên máy chủ nguồn. Kết quả của việc thực hiện nhiều câu lệnh
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 là xác định và bản sao tái tạo dữ liệu giống như trên nguồn. Nếu các giá trị gia tăng tự động được tạo bởi nhiều câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 được xen kẽ, thì kết quả của hai câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 đồng thời sẽ không mang tính quyết định và không thể truyền đến máy chủ bản sao một cách đáng tin cậy bằng cách sử dụng bản sao dựa trên câu lệnhĐể làm rõ điều này, hãy xem xét một ví dụ sử dụng bảng này
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
Giả sử rằng có hai giao dịch đang chạy, mỗi giao dịch chèn các hàng vào một bảng có cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2. Một giao dịch đang sử dụng câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
49 chèn 1000 hàng và một giao dịch khác đang sử dụng câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 đơn giản chèn một hàngCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
4CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
1 không thể biết trước có bao nhiêu hàng được truy xuất từ CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 trong câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 trong Tx1 và nó chỉ định từng giá trị tăng tự động khi câu lệnh tiếp tục. Với khóa cấp bảng, được giữ ở cuối câu lệnh, chỉ một câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 đề cập đến bảngCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
14 có thể thực thi tại một thời điểm và việc tạo các số tăng tự động bằng các câu lệnh khác nhau không được xen kẽ. Các giá trị tăng tự động được tạo bởi câu lệnh Tx1CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
49 là liên tiếp và giá trị tăng tự động [đơn] được sử dụng bởi câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 trong Tx2 nhỏ hơn hoặc lớn hơn tất cả các giá trị được sử dụng cho Tx1, tùy thuộc vào câu lệnh nào thực hiện trướcMiễn là các câu lệnh SQL thực thi theo cùng một thứ tự khi được phát lại từ nhật ký nhị phân [khi sử dụng sao chép dựa trên câu lệnh hoặc trong các tình huống khôi phục], kết quả sẽ giống như khi Tx1 và Tx2 chạy lần đầu. Do đó, các khóa cấp độ bảng được giữ cho đến khi kết thúc câu lệnh tạo ra các câu lệnh
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 sử dụng tự động tăng an toàn để sử dụng với sao chép dựa trên câu lệnh. Tuy nhiên, các khóa cấp bảng đó hạn chế tính đồng thời và khả năng mở rộng khi nhiều giao dịch đang thực thi các câu lệnh chèn cùng một lúcTrong ví dụ trước, nếu không có khóa mức bảng, giá trị của cột tăng tự động được sử dụng cho
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 trong Tx2 phụ thuộc vào thời điểm thực thi chính xác của câu lệnh. NếuCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 của Tx2 thực thi trong khiCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 của Tx1 đang chạy [chứ không phải trước khi nó bắt đầu hoặc sau khi nó hoàn thành], thì các giá trị gia tăng tự động cụ thể được chỉ định bởi hai câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 là không xác định và có thể khác nhau giữa các lần chạyTrong chế độ khóa liên tiếp,
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
1 có thể tránh sử dụng khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 ở cấp độ bảng cho các câu lệnh "chèn đơn giản" trong đó số lượng hàng được biết trước và vẫn đảm bảo thực thi xác định và an toàn cho bản sao dựa trên câu lệnhNếu bạn không sử dụng nhật ký nhị phân để phát lại các câu lệnh SQL như một phần của quá trình khôi phục hoặc sao chép, chế độ khóa xen kẽ có thể được sử dụng để loại bỏ tất cả việc sử dụng khóa
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 cấp bảng để có hiệu suất và đồng thời lớn hơn, với chi phí cho phép các lỗ hổng trongCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
08 [chế độ khóa [“liên tiếp”]Trong chế độ này, "chèn số lượng lớn" sử dụng khóa cấp bảng
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 đặc biệt và giữ nó cho đến khi kết thúc câu lệnh. Điều này áp dụng cho tất cả các câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
49,CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
91 vàCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
92. Mỗi lần chỉ có một câu lệnh giữ khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 có thể thực thi. Nếu bảng nguồn của thao tác chèn hàng loạt khác với bảng đích, khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 trên bảng đích sẽ được thực hiện sau khi khóa chia sẻ được thực hiện trên hàng đầu tiên được chọn từ bảng nguồn. Nếu nguồn và đích của thao tác chèn hàng loạt là cùng một bảng, thì khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 được thực hiện sau khi thực hiện khóa chia sẻ trên tất cả các hàng đã chọn“Chèn đơn giản” [đã biết trước số lượng hàng được chèn] tránh khóa
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 ở cấp độ bảng bằng cách lấy số lượng giá trị tăng tự động cần thiết dưới sự kiểm soát của một mutex [khóa trọng lượng nhẹ] đó là . Không có khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 cấp bảng nào được sử dụng trừ khi khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 được giữ bởi một giao dịch khác. Nếu một giao dịch khác giữ khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04, thì một "chèn đơn giản" sẽ đợi khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04, như thể đó là một "chèn số lượng lớn"Chế độ khóa này đảm bảo rằng, khi có các câu lệnh
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 trong đó số lượng hàng không được biết trước [và khi các số tăng tự động được chỉ định khi câu lệnh tiến triển], tất cả các giá trị tăng tự động được chỉ định bởi bất kỳ "tương tựCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47" nàoNói một cách đơn giản, chế độ khóa này cải thiện đáng kể khả năng mở rộng trong khi vẫn an toàn khi sử dụng với sao chép dựa trên câu lệnh. Hơn nữa, như với chế độ khóa “truyền thống”, các số gia tăng tự động được chỉ định bởi bất kỳ câu lệnh đã cho nào là liên tiếp. Không có thay đổi về ngữ nghĩa so với chế độ “truyền thống” đối với bất kỳ câu lệnh nào sử dụng tăng tự động, với một ngoại lệ quan trọng
Ngoại lệ dành cho "chèn ở chế độ hỗn hợp", trong đó người dùng cung cấp các giá trị rõ ràng cho cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 cho một số, nhưng không phải tất cả, các hàng trong "chèn đơn giản" nhiều hàng. Đối với các lần chèn như vậy,CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
1 phân bổ nhiều giá trị gia tăng tự động hơn số lượng hàng sẽ được chèn. Tuy nhiên, tất cả các giá trị được gán tự động được tạo liên tiếp [và do đó cao hơn] giá trị tăng tự động được tạo bởi câu lệnh trước đó được thực hiện gần đây nhất. Số “thừa” bị mấtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
75 [chế độ khóa [“xen kẽ”]Trong chế độ khóa này, không có câu lệnh “
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47-like” nào sử dụng khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 cấp bảng và nhiều câu lệnh có thể thực thi cùng một lúc. Đây là chế độ khóa nhanh nhất và có thể mở rộng nhất, nhưng không an toàn khi sử dụng các kịch bản khôi phục hoặc sao chép dựa trên câu lệnh khi các câu lệnh SQL được phát lại từ nhật ký nhị phânTrong chế độ khóa này, các giá trị tăng tự động được đảm bảo là duy nhất và tăng đơn điệu trên tất cả các câu lệnh “
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47-like” được thực thi đồng thời. Tuy nhiên, vì nhiều câu lệnh có thể tạo số cùng một lúc [nghĩa là phân bổ số được xen kẽ giữa các câu lệnh], các giá trị được tạo cho các hàng được chèn bởi bất kỳ câu lệnh đã cho nào có thể không liên tiếpNếu các câu lệnh duy nhất đang thực thi là “các phần chèn đơn giản” trong đó số lượng hàng được chèn được biết trước, thì không có khoảng trống nào trong các số được tạo cho một câu lệnh, ngoại trừ “các phần chèn ở chế độ hỗn hợp”. Tuy nhiên, khi "chèn số lượng lớn" được thực thi, có thể có khoảng trống trong các giá trị tăng tự động được chỉ định bởi bất kỳ câu lệnh đã cho nào
Hàm ý sử dụng chế độ khóa AUTO_INCREMENT của InnoDB
Sử dụng tăng tự động với sao chép
Nếu bạn đang sử dụng bản sao dựa trên câu lệnh, hãy đặt
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
45 thành 0 hoặc 1 và sử dụng cùng một giá trị trên nguồn và bản sao của nó. Các giá trị tăng tự động không được đảm bảo giống nhau trên các bản sao cũng như trên nguồn nếu bạn sử dụngCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
45 = 2 [“xen kẽ”] hoặc các cấu hình trong đó nguồn và các bản sao không sử dụng cùng một chế độ khóaNếu bạn đang sử dụng sao chép theo hàng hoặc theo định dạng hỗn hợp, thì tất cả các chế độ khóa tự động gia tăng đều an toàn, vì sao chép theo hàng không nhạy cảm với thứ tự thực thi câu lệnh SQL [và định dạng hỗn hợp sử dụng theo hàng
Các giá trị gia tăng tự động “Mất” và các khoảng trống trình tự
Trong tất cả các chế độ khóa [0, 1 và 2], nếu một giao dịch tạo ra các giá trị tăng tự động quay trở lại, các giá trị tăng tự động đó sẽ bị "mất". Khi một giá trị được tạo cho một cột tăng tự động, nó không thể được khôi phục, cho dù câu lệnh “
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47-like” có được hoàn thành hay không và liệu giao dịch có chứa có được khôi phục hay không. Những giá trị bị mất như vậy không được sử dụng lại. Do đó, có thể có khoảng trống trong các giá trị được lưu trữ trong cộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 của bảngChỉ định NULL hoặc 0 cho cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2Trong tất cả các chế độ khóa [0, 1 và 2], nếu người dùng chỉ định NULL hoặc 0 cho cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 trongCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47, thìCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
1 sẽ xử lý hàng như thể giá trị không được chỉ định và tạo một giá trị mới cho hàng đóGán giá trị âm cho cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2Trong tất cả các chế độ khóa [0, 1 và 2], hoạt động của cơ chế tự động tăng không được xác định nếu bạn gán giá trị âm cho cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2Nếu giá trị
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 trở nên lớn hơn số nguyên tối đa cho loại số nguyên đã chỉ địnhTrong tất cả các chế độ khóa [0, 1 và 2], hành vi của cơ chế tăng tự động không được xác định nếu giá trị trở nên lớn hơn số nguyên tối đa có thể được lưu trữ trong loại số nguyên đã chỉ định
Khoảng trống trong các giá trị tăng tự động cho "chèn hàng loạt"
Với
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
45 được đặt thành 0 [“truyền thống”] hoặc 1 [“liên tiếp”], các giá trị tăng tự động được tạo bởi bất kỳ câu lệnh đã cho nào là liên tiếp, không có khoảng trống, vì khóaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
04 ở cấp độ bảng được giữ cho đến khi kết thúc câu lệnh,Với
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
45 được đặt thành 2 [“xen kẽ”], có thể có khoảng trống trong các giá trị tăng tự động được tạo bởi “chèn hàng loạt”, nhưng chỉ khi có các câu lệnh “giống nhưCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47” được thực thi đồng thờiĐối với chế độ khóa 1 hoặc 2, khoảng cách có thể xảy ra giữa các câu lệnh liên tiếp vì đối với thao tác chèn hàng loạt, số lượng giá trị tăng tự động chính xác mà mỗi câu lệnh yêu cầu có thể không được biết và có thể ước tính quá cao
Giá trị gia tăng tự động được chỉ định bởi "chèn chế độ hỗn hợp"
Hãy xem xét một "chèn chế độ hỗn hợp", trong đó một "chèn đơn giản" chỉ định giá trị tăng tự động cho một số [nhưng không phải tất cả] các hàng kết quả. Một tuyên bố như vậy hoạt động khác nhau trong các chế độ khóa 0, 1 và 2. Ví dụ: giả sử
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
12 là cộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 của bảngCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
14 và số thứ tự được tạo tự động gần đây nhất là 100CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
9Bây giờ, hãy xem xét câu lệnh "chèn chế độ hỗn hợp" sau đây
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
1Với
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
45 được đặt thành 0 [“truyền thống”], bốn hàng mới làCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
0Giá trị tăng tự động khả dụng tiếp theo là 103 vì các giá trị tăng tự động được phân bổ lần lượt, không phải tất cả cùng một lúc khi bắt đầu thực thi câu lệnh. Kết quả này đúng cho dù có hay không có đồng thời thực hiện các câu lệnh “
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47-like” [thuộc bất kỳ loại nào]Với
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
45 được đặt thành 1 [“liên tiếp”], bốn hàng mới cũngCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
0Tuy nhiên, trong trường hợp này, giá trị tăng tự động khả dụng tiếp theo là 105, không phải 103 vì bốn giá trị tăng tự động được phân bổ tại thời điểm câu lệnh được xử lý, nhưng chỉ có hai giá trị được sử dụng. Kết quả này đúng cho dù có hay không có đồng thời thực hiện các câu lệnh “
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47-like” [thuộc bất kỳ loại nào]Với
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
45 được đặt thành 2 [“xen kẽ”], bốn hàng mới làCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
0Các giá trị của
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
22 vàCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
23 là duy nhất và lớn hơn bất kỳ hàng nào được tạo trước đó. Tuy nhiên, các giá trị cụ thể củaCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
22 vàCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
23 phụ thuộc vào số lượng giá trị tăng tự động được tạo bởi các câu lệnh thực thi đồng thờiCuối cùng, hãy xem xét câu lệnh sau, được đưa ra khi số thứ tự được tạo gần đây nhất là 100
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
23Với bất kỳ cài đặt
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
45 nào, câu lệnh này tạo ra lỗi khóa trùng lặp 23000 [CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
27] vì 101 được phân bổ cho hàngCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
28 và việc chèn hàngCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
29 không thành côngSửa đổi giá trị cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 ở giữa chuỗi câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47Trong MySQL5. 7 trở về trước, việc sửa đổi giá trị cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 ở giữa chuỗi câu lệnhCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 có thể dẫn đến lỗi "Mục nhập trùng lặp". Ví dụ: nếu bạn đã thực hiện thao tácCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
17 đã thay đổi giá trị cộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 thành giá trị lớn hơn giá trị tăng tự động tối đa hiện tại, thì các thao tácCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 tiếp theo không chỉ định giá trị tăng tự động không được sử dụng có thể gặp phải lỗi "Mục nhập trùng lặp". Trong Mysql 8. 0 trở lên, nếu bạn sửa đổi giá trị cộtCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
2 thành giá trị lớn hơn giá trị tăng tự động tối đa hiện tại, giá trị mới sẽ được duy trì và các hoạt độngCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
47 tiếp theo sẽ phân bổ giá trị tăng tự động bắt đầu từ giá trị mới, lớn hơn. Hành vi này được thể hiện trong ví dụ sauCREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;
7
InnoDB AUTO_INCREMENT Khởi tạo bộ đếm
Phần này mô tả cách
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 khởi tạo bộ đếm
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2
Nếu bạn chỉ định một cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2 cho một bảng
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1, thì đối tượng bảng trong bộ nhớ chứa một bộ đếm đặc biệt được gọi là bộ đếm tăng tự động được sử dụng khi gán giá trị mới cho cột
Trong MySQL5. 7 trở về trước, bộ đếm tăng tự động được lưu trữ trong bộ nhớ chính, không phải trên đĩa. Để khởi tạo bộ đếm tăng tự động sau khi khởi động lại máy chủ,
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 sẽ thực thi tương đương với câu lệnh sau trong lần chèn đầu tiên vào bảng có chứa cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;0
Trong Mysql 8. 0, hành vi này được thay đổi. Giá trị bộ đếm tăng tự động tối đa hiện tại được ghi vào nhật ký làm lại mỗi khi nó thay đổi và được lưu vào từ điển dữ liệu trên mỗi điểm kiểm tra. Những thay đổi này làm cho giá trị bộ đếm tăng tự động tối đa hiện tại liên tục trong các lần khởi động lại máy chủ
Khi khởi động lại máy chủ sau khi tắt bình thường,
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 khởi tạo bộ đếm tăng tự động trong bộ nhớ bằng cách sử dụng giá trị tăng tự động tối đa hiện tại được lưu trữ trong từ điển dữ liệu
Khi khởi động lại máy chủ trong quá trình khôi phục sự cố,
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 khởi tạo bộ đếm tăng tự động trong bộ nhớ bằng cách sử dụng giá trị tăng tự động tối đa hiện tại được lưu trữ trong từ điển dữ liệu và quét nhật ký làm lại để tìm các giá trị bộ đếm tăng tự động được ghi từ điểm kiểm tra cuối cùng. Nếu giá trị được ghi lại lớn hơn giá trị bộ đếm trong bộ nhớ, giá trị được ghi lại được áp dụng. Tuy nhiên, trong trường hợp máy chủ thoát không mong muốn, việc sử dụng lại giá trị gia tăng tự động được phân bổ trước đó không thể được đảm bảo. Mỗi lần giá trị tăng tự động tối đa hiện tại bị thay đổi do hoạt động của
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;47 hoặc
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;17, giá trị mới được ghi vào nhật ký làm lại, nhưng nếu thoát không mong muốn xảy ra trước khi nhật ký làm lại được xóa vào đĩa, giá trị được phân bổ trước đó có thể bị thay đổi.
Trường hợp duy nhất trong đó
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 sử dụng tương đương với câu lệnh
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;50 FOR UPDATE để khởi tạo bộ đếm tăng tự động là khi nhập bảng không có tệp siêu dữ liệu
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;51. Mặt khác, giá trị bộ đếm tăng tự động tối đa hiện tại được đọc từ tệp siêu dữ liệu
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;51 nếu có. Ngoài việc khởi tạo giá trị bộ đếm, tương đương với câu lệnh
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;50 được sử dụng để xác định giá trị bộ đếm tăng tự động tối đa hiện tại của bảng khi cố gắng đặt giá trị bộ đếm thành một giá trị nhỏ hơn hoặc bằng giá trị bộ đếm được duy trì bằng cách sử dụng
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;54 . Ví dụ: bạn có thể thử đặt giá trị bộ đếm thành giá trị nhỏ hơn sau khi xóa một số bản ghi. Trong trường hợp này, bảng phải được tìm kiếm để đảm bảo rằng giá trị bộ đếm mới không nhỏ hơn hoặc bằng giá trị bộ đếm tối đa thực tế hiện tại
Trong MySQL5. 7 trở về trước, việc khởi động lại máy chủ sẽ hủy bỏ tác dụng của tùy chọn bảng
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;55, tùy chọn này có thể được sử dụng trong câu lệnh
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;56 hoặc
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;57 để đặt giá trị bộ đếm ban đầu hoặc thay đổi giá trị bộ đếm hiện có, tương ứng. Trong Mysql 8. 0, khởi động lại máy chủ không hủy tác dụng của tùy chọn bảng
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;55. Nếu bạn khởi tạo bộ đếm tăng tự động thành một giá trị cụ thể hoặc nếu bạn thay đổi giá trị bộ đếm tăng tự động thành một giá trị lớn hơn, giá trị mới sẽ được duy trì trong suốt quá trình khởi động lại máy chủ
Trong MySQL5. 7 trở về trước, máy chủ khởi động lại ngay sau thao tác
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;59 có thể dẫn đến việc sử dụng lại các giá trị tăng tự động đã được phân bổ trước đó cho giao dịch hoàn nguyên, hoàn nguyên hiệu quả giá trị tăng tự động tối đa hiện tại. Trong Mysql 8. 0, giá trị tăng tự động tối đa hiện tại được duy trì, ngăn việc sử dụng lại các giá trị được phân bổ trước đó
Nếu một câu lệnh
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;60 kiểm tra một bảng trước khi bộ đếm tăng tự động được khởi tạo, thì
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 sẽ mở bảng và khởi tạo giá trị bộ đếm bằng cách sử dụng giá trị tăng tự động tối đa hiện tại được lưu trữ trong từ điển dữ liệu. Sau đó, giá trị được lưu trữ trong bộ nhớ để sử dụng cho các lần chèn hoặc cập nhật sau này. Việc khởi tạo giá trị bộ đếm sử dụng đọc khóa loại trừ bình thường trên bảng kéo dài đến cuối giao dịch.
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 tuân theo quy trình tương tự khi khởi tạo bộ đếm tăng tự động cho bảng mới tạo có giá trị tăng tự động do người dùng chỉ định lớn hơn 0
Sau khi bộ đếm tăng tự động được khởi tạo, nếu bạn không chỉ định rõ ràng giá trị tăng tự động khi chèn một hàng, thì
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 sẽ ngầm tăng bộ đếm và gán giá trị mới cho cột. Nếu bạn chèn một hàng chỉ định rõ ràng giá trị cột tăng tự động và giá trị này lớn hơn giá trị bộ đếm tối đa hiện tại, thì bộ đếm được đặt thành giá trị đã chỉ định
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 sử dụng bộ đếm tăng tự động trong bộ nhớ miễn là máy chủ chạy. Khi máy chủ bị dừng và khởi động lại,
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;1 sẽ khởi tạo lại bộ đếm tăng tự động, như đã mô tả trước đó
Biến
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;66 xác định điểm bắt đầu cho giá trị cột
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2. Cài đặt mặc định là 1
Biến
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;68 kiểm soát khoảng thời gian giữa các giá trị cột liên tiếp. Cài đặt mặc định là 1
Khi cột số nguyên
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;2 hết giá trị, thao tác
CREATE TABLE t1 [ c1 INT[11] NOT NULL AUTO_INCREMENT, c2 VARCHAR[10] DEFAULT NULL, PRIMARY KEY [c1] ] ENGINE=InnoDB;47 tiếp theo sẽ trả về lỗi khóa trùng lặp. Đây là hành vi chung của MySQL