MySQL AUTO_INCREMENT kèm các ví dụ

⚡ Tóm tắt thông minh

MySQL Thuộc tính AUTO_INCREMENT tự động tạo số thứ tự cho một cột số mỗi khi chèn một hàng. Thuộc tính này loại bỏ nhu cầu tính toán mã định danh duy nhất bằng tay, do đó trở thành cách chuẩn để điền vào khóa chính.

  • 🔢 Hành vi cốt lõi: AUTO_INCREMENT sẽ tự động tăng số thứ tự mỗi khi có hàng mới được chèn vào, bắt đầu từ 1 và bước nhảy tiếp theo.ping bởi 1.
  • 🔑 Vai trò chủ chốt: Thuộc tính này đảm bảo một mã định danh duy nhất mà không cần truy vấn tìm kiếm, vì vậy nó là lựa chọn tiêu chuẩn cho khóa chính thay thế.
  • 🧱 Yêu cầu về cột: Cột phải có kiểu dữ liệu số nguyên và phải được lập chỉ mục, điều này đã được đáp ứng bởi khai báo PRIMARY KEY.
  • Chèn mẫu: Bỏ cột định danh khỏi câu lệnh INSERT và MySQL Cung cấp giá trị, sau đó hàm LAST_INSERT_ID() sẽ trả về giá trị đó.
  • 🎚️ Giá trị khởi đầu tùy chỉnh: Lệnh CREATE TABLE hoặc ALTER TABLE chấp nhận AUTO_INCREMENT = 10 để bắt đầu chuỗi số từ một số đã chọn.
  • 🕳️ Hãy chuẩn bị tinh thần cho những khoảng trống: Các hàng bị xóa và các giao dịch được hoàn tác sẽ tiêu hao số thứ tự vĩnh viễn, do đó chuỗi số vẫn duy nhất nhưng không liên tục.

MySQL TỰ ĐỘNG

Tăng tự động là gì?

Tăng tự động là một hàm hoạt động trên các kiểu dữ liệu số. Nó tự động tạo ra các giá trị số tuần tự mỗi khi một bản ghi được chèn vào bảng cho một trường được xác định là tăng tự động.

Thuộc tính này hoạt động trên mọi kiểu dữ liệu số nguyên, từ TINYINT đến BIGINT. Cột cũng phải được lập chỉ mục, điều này diễn ra tự động khi nó được khai báo là khóa chính.

Khi sử dụng tăng tự động?

Trong bài học về chuẩn hóa cơ sở dữ liệuChúng ta đã xem xét cách thức lưu trữ dữ liệu với độ dư thừa tối thiểu bằng cách lưu trữ dữ liệu vào nhiều bảng nhỏ, liên kết với nhau bằng khóa chính và khóa ngoại.

MySQL AUTO_INCREMENT kèm các ví dụ

Khóa chính phải là duy nhất, vì nó xác định duy nhất một hàng trong cơ sở dữ liệu. Nhưng làm thế nào chúng ta có thể đảm bảo rằng khóa chính luôn luôn duy nhất?

Một trong những giải pháp khả thi là sử dụng công thức để tạo khóa chính, công thức này sẽ kiểm tra sự tồn tại của khóa trong bảng trước khi thêm dữ liệu. Cách này có thể hiệu quả, nhưng phương pháp này phức tạp và không hoàn toàn đáng tin cậy. Hai phiên chèn dữ liệu cùng một lúc vẫn có thể đọc cùng một giá trị tối đa và dẫn đến xung đột.

Để tránh sự phức tạp như vậy và để đảm bảo rằng khóa chính luôn duy nhất, chúng ta có thể sử dụng MySQL Tính năng tự động tăng được sử dụng để tạo khóa chính. Tính năng tự động tăng được sử dụng với kiểu dữ liệu INT. Kiểu dữ liệu INT hỗ trợ cả giá trị có dấu và không dấu. Kiểu dữ liệu không dấu chỉ có thể chứa số dương. Theo kinh nghiệm tốt nhất, nên định nghĩa ràng buộc không dấu trên khóa chính tự động tăng.

Cú pháp tăng tự động

Sau khi đã làm rõ lý lẽ, hãy xem xét kịch bản được sử dụng để tạo bảng phân loại phim.

CREATE TABLE `categories` (
  `category_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `category_name` varchar(150) DEFAULT NULL,
  `remarks` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`category_id`)
);

Hãy chú ý đến thuộc tính “AUTO_INCREMENT” trên trường category_id. Thuộc tính này khiến mã định danh danh mục được tự động tạo mỗi khi một hàng mới được chèn vào bảng. Mã này không được cung cấp khi chèn dữ liệu vào bảng. MySQL tạo ra nó.

Lưu ý: Từ khóa UNSIGNED nhân đôi phạm vi dương của cột và chiều rộng hiển thị từng được viết dưới dạng int(11) đã bị loại bỏ. MySQL Từ phiên bản 8.0.17 trở đi. Plain int Đây là hình thức hiện tại.

Theo mặc định, giá trị ban đầu của AUTO_INCREMENT là 1, và nó sẽ tăng thêm 1 cho mỗi bản ghi mới.

Chúng ta hãy cùng xem xét nội dung hiện tại của bảng danh mục.

SELECT * FROM `categories`;

Thực thi đoạn script trên trong MySQL Việc chạy lệnh Workbench trên cơ sở dữ liệu myflixdb cho chúng ta các kết quả sau.

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL

Hiện có tám hàng, vì vậy ID được tạo tiếp theo sẽ là 9. Bây giờ chúng ta hãy chèn một danh mục mới vào bảng danh mục, chỉ cần cung cấp tên.

INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');

Thực thi đoạn script trên đối với myflixdb trong MySQL bàn làm việc cho chúng ta kết quả như hình dưới đây.

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL
9 Cartoons NULL

Xin lưu ý rằng chúng tôi không cung cấp mã định danh danh mục. MySQL Nó được tạo tự động vì ID danh mục được định nghĩa là tự động tăng.

Nếu bạn muốn lấy id chèn cuối cùng được tạo bởi MySQL, bạn có thể sử dụng hàm LAST_INSERT_ID để làm điều đó. Tập lệnh hiển thị bên dưới lấy id cuối cùng được tạo.

SELECT LAST_INSERT_ID();

Việc thực thi đoạn mã trên sẽ trả về số tự động tăng cuối cùng được tạo ra bởi truy vấn INSERT. Kết quả được hiển thị bên dưới.

MySQL TỰ ĐỘNG

Mẹo: LAST_INSERT_ID() chỉ có phạm vi cho kết nối của bạn, vì vậy giá trị được tạo ra bởi thao tác chèn của người dùng khác sẽ không bao giờ được trả về cho bạn một cách nhầm lẫn.

Cách thiết lập hoặc đặt lại giá trị bắt đầu của AUTO_INCREMENT

Trình tự mặc định bắt đầu từ 1, nhưng đó không phải lúc nào cũng là điều mà một dự án cần. Số hóa đơn có thể phải tiếp tục từ hệ thống cũ và bảng kiểm tra thường phải được thiết lập lại. MySQL Nó hiển thị trực tiếp bộ đếm, vì vậy cả hai trường hợp đều được xử lý bằng một mệnh đề duy nhất. Hãy làm theo các bước sau để kiểm soát số bắt đầu.

  1. Đặt giá trị tại thời điểm tạo. Thêm mệnh đề AUTO_INCREMENT vào câu lệnh CREATE TABLE. Hàng đầu tiên được chèn vào sẽ nhận số đó thay vì số 1.
  2. Thay đổi giá trị trên một bảng hiện có. Sử dụng BẢNG BẢNG với cùng một điều khoản. MySQL Chỉ chấp nhận số mới nếu nó lớn hơn số định danh lớn nhất hiện đang được lưu trữ.
  3. Khôi phục lại bảng mà bạn đã xóa trống. Lệnh TRUNCATE TABLE xóa tất cả các hàng và trả về bộ đếm về 1 trong một thao tác duy nhất, điều mà lệnh DELETE đơn thuần không làm được.
  4. Xác nhận thay đổi. Chèn một hàng và đọc lại mã định danh bằng hàm LAST_INSERT_ID() trước khi dựa vào chuỗi mới.
-- Start a brand-new table at 1000
CREATE TABLE `invoices` (
  `invoice_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `amount` decimal(10,2),
  PRIMARY KEY (`invoice_id`)
) AUTO_INCREMENT = 1000;

-- Move the counter on an existing table
ALTER TABLE `categories` AUTO_INCREMENT = 100;

-- Empty the table and reset the counter to 1
TRUNCATE TABLE `categories`;

Kích thước bước cũng có thể được thay đổi bằng biến hệ thống auto_increment_increment, nhưng nó áp dụng cho toàn bộ máy chủ chứ không phải cho một bảng. Nó chủ yếu được sử dụng trong sao chép dữ liệu, nơi hai máy chủ không được tạo ra cùng một mã định danh.

Tại sao lại xuất hiện khoảng trống trong chuỗi AUTO_INCREMENT?

Sớm muộn gì bảng cũng sẽ hiển thị các mã định danh như 1, 2, 5, 6. Không có gì sai cả. Bộ đếm được thiết kế để đảm bảo tính duy nhất, chứ không phải để đảm bảo một dãy số liên tục, và nó không bao giờ trả về cùng một giá trị hai lần.

Khoảng trống xuất hiện vì những lý do sau.

  • Các hàng đã bị xóa: Khi một hàng bị xóa khỏi bảng, ID tự động tăng của hàng đó sẽ không được sử dụng lại. MySQL tiếp tục tạo ra các số mới theo trình tự.
  • Các giao dịch đã bị hoàn tác: Số thứ tự được giữ lại ngay khi thao tác chèn dữ liệu hoàn tất. Nếu giao dịch bị hủy bỏ, hàng dữ liệu sẽ biến mất nhưng số thứ tự đó đã được sử dụng.
  • Các thao tác chèn không thành công: Một câu lệnh bị từ chối bởi ràng buộc UNIQUE vẫn có thể sử dụng một định danh trước khi nó thất bại.
  • Chèn số lượng lớn: InnoDB có thể dành riêng một khối số cho việc chèn nhiều hàng và loại bỏ những số không được sử dụng.

Cố gắng lấp đầy những khoảng trống này là một sai lầm. Việc đánh số lại các hàng sẽ phá vỡ mọi khóa ngoại trỏ đến chúng, và bản thân giá trị đó không có ý nghĩa gì trong nghiệp vụ. Nếu báo cáo cần một danh sách liên tục, hãy tạo số thứ tự hàng trong truy vấn thay vì viết lại dữ liệu đã lưu trữ.

Câu Hỏi Thường Gặp

STT MySQL Mỗi bảng chỉ được phép có duy nhất một cột AUTO_INCREMENT, và cột đó phải được lập chỉ mục. Việc khai báo nó như vậy sẽ dẫn đến việc cần phải có chỉ mục. khóa chính Đáp ứng yêu cầu về chỉ số.

Thao tác chèn dữ liệu thất bại với lỗi khóa trùng lặp, vì bộ đếm không thể vượt quá giá trị tối đa của kiểu dữ liệu. Kiểu dữ liệu TINYINT không dấu chỉ dừng lại ở 255. Hãy thay đổi cột sang kiểu dữ liệu rộng hơn như BIGINT trước khi đạt đến giá trị đó.

Có, từ MySQL Từ phiên bản 8.0 trở đi, InnoDB ghi bộ đếm vào nhật ký redo, do đó nó được khôi phục sau khi khởi động lại. Các phiên bản trước đó tính toán lại bộ đếm và có thể cấp lại các số đã được giải phóng do xóa.

Một phần. Các trợ lý lược đồ AI bên trong các công cụ như... MySQL Workbench Hãy đề xuất một số nguyên không dấu đủ rộng cho khối lượng mà bạn mô tả. Ước tính này chỉ chính xác khi con số tăng trưởng bạn cung cấp chính xác, vì vậy hãy kiểm chứng lại.

Thường thì đúng vậy. Các trợ lý truy vấn AI chỉ ra các giao dịch bị hoàn tác, các giao dịch thất bại. CHÈN Các câu lệnh và các hàng bị xóa thường là nguyên nhân gây ra vấn đề. Hãy xem lời giải thích này như một điểm khởi đầu và xác nhận lại bằng cách đối chiếu với nhật ký máy chủ.

Tóm tắt bài viết này với: