MySQL 主键和自增

MySQL 主键和自增

主键是表的重要概念,搞懂怎么用很有必要。

1. 什么是主键

主键(Primary Key)是表中唯一标识一行记录的字段。

特点:

  • 唯一性: 每行数据主键不能重复
  • 非空性: 主键不能为 NULL
  • 一张表只能有一个主键

2. 创建主键

建表时指定

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

自增主键(最常用)

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
);

3. 自增主键特点

  • 自动增长: 插入数据不用指定ID,自动+1
  • 从1开始: 默认从1开始
  • 不重复: 保证唯一
-- 插入数据不用写id
INSERT INTO users (name) VALUES ('张三');

-- id自动变成1
-- 再插入自动变成2

4. 查看自增值

-- 查看表当前自增值
SHOW TABLE STATUS LIKE 'users';

-- 查看建表语句
SHOW CREATE TABLE users;

5. 修改自增值

-- 设置下一次自增值为100
ALTER TABLE users AUTO_INCREMENT = 100;

6. 联合主键

多个字段组成主键:

CREATE TABLE user_role (
    user_id INT,
    role_id INT,
    PRIMARY KEY (user_id, role_id)
);

7. 主键设计建议

1)用自增整数做主键

  • INT 或 BIGINT
  • 查询快,占用空间小
  • 不要用 UUID 做主键

2)为什么不用字符串做主键

  • 占空间大
  • 查询慢
  • 自增效率高

3)什么时候用联合主键

  • 中间表(如用户角色关联表)
  • 没有合适的单字段做主键

4)BIGINT 还是 INT

  • 一般 INT 够用(约21亿)
  • 数据量大用 BIGINT

8. 常见问题

1)删除数据后ID不连续

  • 正常现象,自增只增不减
  • 不要依赖ID连续

2)自增值跳号

  • 删除了中间数据
  • 插入失败也会占用ID
  • 正常现象

3)为什么不用手机号做主键

  • 可能会变
  • 字符串查询慢
  • 用自增ID更稳妥

总结

MySQL 主键和自增要点:

  • 主键唯一且非空
  • 一张表只能一个主键
  • 自增主键最常用
  • 用 INT 或 BIGINT
  • 不要用 UUID 做主键
  • 中间表可以用联合主键
  • ID不连续是正常现象

主键设计对表性能影响很大,一定要重视。


emer 发布于  2026-10-9 07:25 

MySQL 常用数据类型

MySQL 常用数据类型

建表选对数据类型很重要,这些常用类型要记住。

1. 数值类型

整数类型

  • TINYINT: 1字节,范围 -128~127
  • SMALLINT: 2字节,范围 -32768~32767
  • INT: 4字节,常用,范围约 ±21亿
  • BIGINT: 8字节,大数值

小数类型

  • FLOAT: 单精度浮点数
  • DOUBLE: 双精度浮点数
  • DECIMAL: 精确小数,存金额用这个
-- 金额用 DECIMAL(总位数, 小数位数)
price DECIMAL(10,2)  -- 最多10位,2位小数

2. 字符串类型

CHAR: 定长字符串,比如 CHAR(10) 存不满补空格

  • 适合固定长度,比如手机号、性别

VARCHAR: 变长字符串,最常用

  • VARCHAR(255),存多少占多少
  • 适合变长内容,比如用户名、标题

TEXT: 长文本

  • TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
  • 存文章内容、备注等

常用选择:

  • 短文本:VARCHAR(50)
  • 长文本:TEXT
  • 固定长度:CHAR

3. 日期时间类型

DATE: 日期,格式 YYYY-MM-DD
TIME: 时间,格式 HH:MM:SS
DATETIME: 日期+时间,范围 1000-9999年
TIMESTAMP: 时间戳,范围 1970-2038年,自动更新

create_time DATETIME DEFAULT CURRENT_TIMESTAMP
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

4. 常用字段设计示例

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL COMMENT '用户名',
    age TINYINT UNSIGNED COMMENT '年龄',
    phone CHAR(11) COMMENT '手机号',
    money DECIMAL(10,2) DEFAULT 0 COMMENT '余额',
    status TINYINT DEFAULT 1 COMMENT '状态:1正常 0禁用',
    content TEXT COMMENT '简介',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

5. 选择建议

1)主键ID

  • 用 INT 或 BIGINT
  • 不要用 UUID 做主键

2)金额

  • 用 DECIMAL,不要用 FLOAT/DOUBLE
  • 避免精度丢失

3)状态字段

  • 用 TINYINT,不要用 VARCHAR 存 "正常/禁用"

4)时间

  • 创建时间用 DATETIME
  • 更新时间用 TIMESTAMP 自动更新

5)字符串

  • 短文本用 VARCHAR
  • 长文本用 TEXT
  • 固定长度用 CHAR

6. 注意事项

  • 不要过度设计: 够用就行,不要字段太大
  • 能用数字不用字符串: 排序、计算都快
  • 避免 NULL: 尽量设默认值,NULL 不好查询
  • 加注释: 每个字段都加 COMMENT

总结

MySQL 常用数据类型要点:

  • INT/BIGINT:整数
  • DECIMAL:金额
  • VARCHAR:字符串
  • TEXT:长文本
  • DATETIME/TIMESTAMP:时间
  • 主键用 INT 自增
  • 金额用 DECIMAL
  • 状态用 TINYINT
  • 字段加注释

建表选对类型,性能和存储都好。


emer 发布于  2026-10-9 07:19