Thuộc tính AUTO_INCREMENT
có thể được sử dụng để tạo danh tính duy nhất cho các hàng mới. Khi bạn chèn một bản ghi mới vào bảng [hoặc khi thêm thuộc tính AUTO_INCREMENT bằng câu lệnh ALTER TABLE] và trường auto_increment là NULL hoặc DEFAULT [trong trường hợp là INSERT], giá trị sẽ tự động được tăng lên. Điều này cũng áp dụng cho 0, trừ khi được bật
Các cột AUTO_INCREMENT
bắt đầu từ 1 theo mặc định. Giá trị được tạo tự động không bao giờ được thấp hơn 0
Mỗi bảng chỉ có thể có một cột AUTO_INCREMENT
. Nó phải được định nghĩa là một khóa [không nhất thiết phải là khóa
SELECT * FROM animals; +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | +----+---------+1 hoặc
SELECT * FROM animals; +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | +----+---------+2]. Trong một số công cụ lưu trữ [bao gồm cả InnoDB mặc định], nếu khóa bao gồm nhiều cột, thì cột
AUTO_INCREMENT
phải là cột đầu tiên. Các công cụ lưu trữ cho phép đặt cột ở nơi khác là Aria, MyISAM, MERGE, Spider, TokuDB, BLACKHOLE, FederatedX và FederatedCREATE TABLE animals [ id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR[30] NOT NULL, PRIMARY KEY [id] ]; INSERT INTO animals [name] VALUES ['dog'],['cat'],['penguin'], ['fox'],['whale'],['ostrich'];
SELECT * FROM animals; +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | +----+---------+
SELECT * FROM animals; +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | +----+---------+4 là bí danh của
SELECT * FROM animals; +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | +----+---------+5
CREATE TABLE t [id SERIAL, c CHAR[1]] ENGINE=InnoDB; SHOW CREATE TABLE t \G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` [ `id` bigint[20] unsigned NOT NULL AUTO_INCREMENT, `c` char[1] DEFAULT NULL, UNIQUE KEY `id` [`id`] ] ENGINE=InnoDB DEFAULT CHARSET=latin1
Đặt hoặc Thay đổi Giá trị Auto_Increment
Bạn có thể sử dụng câu lệnh
SELECT * FROM animals; +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | +----+---------+6 để gán giá trị mới cho tùy chọn bảng
SELECT * FROM animals; +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | +----+---------+7 hoặc đặt biến hệ thống máy chủ để thay đổi giá trị
AUTO_INCREMENT
tiếp theo được phiên hiện tại chèn vàoCó thể sử dụng
SELECT * FROM animals; +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | +----+---------+9 để xem giá trị
AUTO_INCREMENT
cuối cùng được phiên hiện tại chèn vàoALTER TABLE animals AUTO_INCREMENT=8; INSERT INTO animals [name] VALUES ['aardvark']; SELECT * FROM animals; +----+-----------+ | id | name | +----+-----------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | | 8 | aardvark | +----+-----------+ SET insert_id=12; INSERT INTO animals [name] VALUES ['gorilla']; SELECT * FROM animals; +----+-----------+ | id | name | +----+-----------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | fox | | 5 | whale | | 6 | ostrich | | 8 | aardvark | | 12 | gorilla | +----+-----------+
InnoDB
Cho đến khi MariaDB 10. 2. 3, InnoDB đã sử dụng bộ đếm tăng tự động được lưu trữ trong bộ nhớ. Khi máy chủ khởi động lại, bộ đếm được khởi tạo lại thành giá trị cao nhất được sử dụng trong bảng, điều này sẽ hủy bỏ tác dụng của bất kỳ tùy chọn AUTO_INCREMENT = N nào trong các câu lệnh của bảng
Từ MariaDB 10. 2. 4, hạn chế này đã được dỡ bỏ và AUTO_INCREMENT vẫn tồn tại
Xem thêm Xử lý AUTO_INCREMENT trong InnoDB
Đặt giá trị rõ ràng
Có thể chỉ định giá trị cho cột AUTO_INCREMENT
. Nếu khóa là chính hoặc duy nhất, giá trị phải chưa tồn tại trong khóa
Nếu giá trị mới cao hơn giá trị tối đa hiện tại, giá trị AUTO_INCREMENT
được cập nhật, vì vậy giá trị tiếp theo sẽ cao hơn. Nếu giá trị mới thấp hơn giá trị tối đa hiện tại, giá trị AUTO_INCREMENT
vẫn không thay đổi
Ví dụ sau minh họa những hành vi này
CREATE TABLE t [id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY] ENGINE = InnoDB; INSERT INTO t VALUES [NULL]; SELECT id FROM t; +----+ | id | +----+ | 1 | +----+ INSERT INTO t VALUES [10]; -- higher value SELECT id FROM t; +----+ | id | +----+ | 1 | | 10 | +----+ INSERT INTO t VALUES [2]; -- lower value INSERT INTO t VALUES [NULL]; -- auto value SELECT id FROM t; +----+ | id | +----+ | 1 | | 2 | | 10 | | 11 | +----+
Công cụ lưu trữ ARCHIVE không cho phép chèn giá trị thấp hơn giá trị tối đa hiện tại
Giá trị bị mất
Cột AUTO_INCREMENT thường thiếu giá trị. Điều này xảy ra bởi vì nếu một hàng bị xóa hoặc giá trị AUTO_INCREMENT được cập nhật rõ ràng, thì các giá trị cũ sẽ không bao giờ được sử dụng lại. Câu lệnh REPLACE cũng xóa một hàng và giá trị của nó bị lãng phí. Với InnoDB, các giá trị có thể được bảo lưu bởi một giao dịch;
Do đó, các giá trị AUTO_INCREMENT có thể được sử dụng để sắp xếp kết quả theo thứ tự thời gian, nhưng không phải để tạo chuỗi số
Để làm cho master-master hoặc Galera an toàn khi sử dụng AUTO_INCREMENT
, người ta nên sử dụng các biến hệ thống và tạo các giá trị duy nhất cho mỗi máy chủ