Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL สร้าง INT Field เริ่มต้นที่ 1000 ด้วย AUTO_INCREMENT (ไม่ใช่ Primary Key)

ตั้งค่า AUTO_INCREMENT เริ่มต้นที่ค่าที่ต้องการ

ใช้ ALTER TABLE ... AUTO_INCREMENT = value ตั้งค่าเริ่มต้นของ Auto Increment Column

ข้อจำกัด: AUTO_INCREMENT ต้องเป็น Key

MySQL ต้องการให้ Auto Increment Column เป็นส่วนหนึ่งของ Key (Primary Key หรือ Unique Index)

ตัวอย่าง: StudentStartId เริ่มที่ 1000 (ไม่ใช่ PK)

CREATE TABLE DemoTable639 (
    StudentId INT PRIMARY KEY,
    StudentStartId INT AUTO_INCREMENT,
    StudentName VARCHAR(50),
    INDEX(StudentStartId)  -- ต้องมี Index
);

-- ตั้งค่าเริ่มต้น
ALTER TABLE DemoTable639 AUTO_INCREMENT = 1000;

INSERT INTO DemoTable639(StudentId, StudentName) VALUES
(1, 'John'), (2, 'Chris'), (3, 'Robert'), (4, 'David');

ผลลัพธ์:

+-----------+----------------+-------------+
| StudentId | StudentStartId | StudentName |
+-----------+----------------+-------------+
| 1         | 1000           | John        |
| 2         | 1001           | Chris       |
| 3         | 1002           | Robert      |
| 4         | 1003           | David       |
+-----------+----------------+-------------+

กรณีทั่วไป: Primary Key เริ่มที่ 1000

CREATE TABLE users (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100)
);

ALTER TABLE users AUTO_INCREMENT = 1000;

INSERT INTO users(name) VALUES('John');  -- id = 1000

ข้อควรระวัง

  1. AUTO_INCREMENT ต้องเป็น Key (PK หรือ Unique Index) - มิฉะจะ Error: "Incorrect table definition"
  2. ค่า AUTO_INCREMENT ต้อง > Max Existing Value - ไม่สามารถตั้งค่าต่ำกว่าค่าที่มีอยู่ได้
  3. TRUNCATE TABLE จะ Reset AUTO_INCREMENT - กลับไปที่ 1 (หรือค่าที่ ALTER ตั้งไว้)
  4. DELETE ไม่ Reset - ต่อจากค่าเดิม

Reset AUTO_INCREMENT

-- Reset ไปค่าที่ต้องการ
ALTER TABLE table_name AUTO_INCREMENT = 1000;

-- Reset ไป Max + 1 (หลัง Delete เยอะ)
ALTER TABLE table_name AUTO_INCREMENT = 1;  -- จริงๆ จะไปที่ MAX(id)+1

ใช้ LAST_INSERT_ID() ดึงค่าที่เพิ่ง Generate

INSERT INTO users(name) VALUES('New User');
SELECT LAST_INSERT_ID();  -- คืนค่า Auto Increment ที่เพิ่ง Insert

MySQL 8.0: AUTO_INCREMENT Counter ใน Memory

MySQL 8.0 เก็บ Auto Increment Counter ใน Memory (Redo Log) ไม่ได้เก็บใน Disk ทุกครั้ง → เร็วขึ้น แต่ Restart อาจข้ามค่า (Gap) ได้

Alternative: Sequence (MySQL 8.0+ ไม่มี SEQUENCE Object ใช้ Table แทน)

CREATE TABLE seq_table (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
INSERT INTO seq_table VALUES (NULL);
SELECT LAST_INSERT_ID();