MySQL数据定义与分页:约束使用及LIMIT语法详解

陆遥
陆遥
发布时间:2026-10-13| 5人浏览过
原创

本文详细讲解了MySQL中定义表时的核心约束机制与数据分页技巧。内容覆盖主键、自增、唯一、非空及外键的创建方法与校验规则,并通过实际代码演示LIMIT在单页抓取、排序提取及通用分页算法中的应用,帮助开发者规范数据结构并高效处理查询结果。

1. Primary Key 主键约束

主键用于唯一标识表中的一条记录。其核心特性为不可为空且不可重复。一张表只能包含一个主键约束。

操作示例:

-- 创建含主键的用户表
create table user1(id int primary key, name varchar(32));

-- 插入正常数据
insert into user1 values(1,'hb');

-- 尝试插入重复ID,触发错误
insert into user1 values(1,'hb');
-- Error: Duplicate entry '1' for key 'PRIMARY'

-- 尝试不传ID(无默认值),触发错误
insert into user1 (name) values('hb');
-- Error: Field 'id' doesn't have a default value

2. Auto Increment 自增长

通常配合主键使用,自动为新增记录分配递增整数 ID。若未在 INSERT 中指定该列值,系统将自动填入下一个序列号。

操作示例:

-- 定义自增长主键
create table user2(id int primary key auto_increment, name varchar(34));

-- 仅插入姓名,ID自动生成
insert into user2 (name) values ('name1');
insert into user2 (name) values ('name2');
insert into user2 (name) values ('name3');

-- 验证数据
select * from user2;
+----+-------+
| id | name  |
+----+-------+
|  1 | name1 |
|  2 | name2 |
|  3 | name3 |
+----+-------+

3. Unique 唯一约束

确保列中的数据不重复。注意:唯一约束允许 NULL 值存在,且多个 NULL 被视为互不冲突。

操作示例:

-- 创建含唯一姓名的用户表
create table user3(id int primary key auto_increment, name varchar(34) unique);

-- 插入相同名称失败
insert into user3 (name) values ('name3');
insert into user3 (name) values ('name3');
-- Error: Duplicate entry 'name3' for key 'name'

-- 插入多个 NULL 成功
insert into user3 (name) values (null);
insert into user3 (name) values (null);

select * from user3;
+----+------+
| id | name |
+----+------+
|  3 | name3|
|  4 | NULL |
|  5 | NULL |
+----+------+

4. Not Null 非空约束

MySQL 字段默认为可空,添加 not null 后,插入时必须提供有效值,否则报错。

操作示例:

create table user4 (id int primary key auto_increment, name varchar(32) not null);

insert into user4 (name) values (null);
-- Error: Column 'name' cannot be null

5. Foreign Key 外键约束

外键用于建立表间关联。从表的外键需引用主表的主键或唯一键,且数据类型必须一致。

操作顺序:

  1. 先创建被引用的主表(部门表)。
  2. 再创建含有外键的从表(雇员表)。

操作示例:

-- 1. 建立主表
create table dept(id int primary key, name varchar(32));
insert into dept values(1, 'tech_dept');

-- 2. 建立从表并定义外键
create table emp(
  id int primary key,
  name varchar(32),
  deptid int,
  constraint myforeignkey foreign key(deptid) references dept(id)
);

-- 正常插入关联数据
insert into emp values(1, 'Alice', 1);

-- 关联不存在的主键ID,或主键冲突时报错
insert into emp values(1, 'Bob', 2); 
-- Error: Duplicate entry... (此处原例可能因ID冲突报错,外键检查通常针对值非法)

-- 允许外键列为NULL
insert into emp values(2, 'Charlie', null);

外键关键规则:

  • 外键必须指向主表的主键列或唯一列。
  • 内外键的数据类型、字符集必须保持一致。
  • 外键值只能是 NULL 或主表中存在的值。
  • 外键也可指向本表的主键(自关联场景)。

6. MySQL 对 CHECK 的支持情况

在多数版本的 MySQL(特别是 8.0.16 之前)中,CHECK 子句会被解析但不会强制执行。

create table user99(age int check(age>13));
insert into user99 values(99); -- 即使违反逻辑也写入成功

注:MySQL 8.0.16 开始支持检查约束,但仍以警告形式提示忽略,具体行为视版本而定。

7. MySQL 分页实现 (Limit)

MySQL 通过 LIMIT 关键字实现分页。索引从 0 开始计算。

第1步:基础分页

语法:SELECT ... FROM 表名 LIMIT offset, count;

说明:offset 是跳过前的行数,count 是返回的行数。

操作示例:获取数据集中第 3 和第 4 条记录(跳过前2条,取2条)。

-- 测试表 student 数据略...
select * from student limit 2, 2;
+------+--------+---------+---------+------+
| id   | name   | chinese | english | math |
+------+--------+---------+---------+------+
|  3   | 王五   |      87 |      78 |   77 |
|  4   | 李一   |      88 |      98 |   90 |
+------+--------+---------+---------+------+

第2步:结合排序分页

在获取特定页面的数据前,通常需要先按业务需求排序,以保证“第N页”内容的一致性。

操作示例:按语文成绩倒序排列,获取第 4-5 条(即跳过前3个高分者)。*

select * from student order by chinese desc limit 3, 2;
+------+--------+---------+---------+------+
| id   | name   | chinese | english | math |
+------+--------+---------+---------+------+
|  5   | 李来财 |      82 |      84 |   67 |
|  7   | 张小明 |      75 |      65 |   30 |
+------+--------+---------+---------+------+

第3步:通用分页公式

在实际开发中,通常通过前端传递当前页码 pageNow 和每页大小 pageSize。起始偏移量计算公式如下:

计算公式:

OFFSET = (pageNow - 1) * pageSize

完整 SQL 结构:

SELECT * FROM table_name 
WHERE condition 
GROUP BY ... HAVING ...
ORDER BY column_name 
LIMIT (pageNow-1)*pageSize, pageSize;

以上就是 MySQL 数据库表约束与分页方法的详细内容,更多关于 MySQL 基础语法优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。