MySQL数据定义与分页:约束使用及LIMIT语法详解
本文详细讲解了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. 建立主表
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 基础语法优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













