MySQL的约束
MySQL约束介绍:约束顾名思义就是不允许去做某些事情。
约束有:
唯一约束:对当前的表中某一个的字段加了唯一约束之后,这个表中的这个字段不允许出现重复值
非空约束:不允许出现空值
主键约束:唯一约束+非空约束
外键约束:保证表与表之间数据的完整性和准确性
创建表设置唯一约束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | mysql> create table stu(num int unique,name varchar(11)); Query OK, 0 rows affected (0.06 sec) mysql> insert into stu values(1, 'chenxi' ); Query OK, 1 row affected (0.05 sec) mysql> insert into stu values(1, 'chenxi' ); ERROR 1062 (23000): Duplicate entry '1' for key 'num' mysql> insert into stu values(2, 'chenxi' ); Query OK, 1 row affected (0.05 sec) mysql> select * from stu; +------+--------+ | num | name | +------+--------+ | 1 | chenxi | | 2 | chenxi | +------+--------+ 2 rows in set (0.00 sec) |
查看表结构
1 2 3 4 5 6 7 8 | mysql> desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | num | int(11) | YES | UNI | NULL | | | name | varchar(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) |
查如的数据可以为空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | mysql> insert into stu values(null, "cx" ); Query OK, 1 row affected (0.04 sec) mysql> insert into stu values(null, "yu" ); Query OK, 1 row affected (0.03 sec) mysql> select * from stu; +------+--------+ | num | name | +------+--------+ | 1 | chenxi | | 2 | chenxi | | NULL | cx | | NULL | yu | +------+--------+ 4 rows in set (0.00 sec) |
非空约束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | mysql> create table stu(num int not null,name varchar(11)); Query OK, 0 rows affected (0.05 sec) mysql> insert into stu values(null, "yu" ); ERROR 1048 (23000): Column 'num' cannot be null mysql> insert into stu values(1, "yu" ); Query OK, 1 row affected (0.01 sec) mysql> insert into stu values(1, "yu" ); Query OK, 1 row affected (0.03 sec) mysql> desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | num | int(11) | NO | | NULL | | | name | varchar(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) |
创建非空约束与唯一建约束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | mysql> drop table stu; 删除 Query OK, 0 rows affected (0.03 sec) mysql> create table stu(num int not null unique,name varchar(11)); 创建 Query OK, 0 rows affected (0.04 sec) mysql> insert into stu values(1, "cx" ); 插入 Query OK, 1 row affected (0.03 sec) mysql> insert into stu values(1, "cx" ); 插入 ERROR 1062 (23000): Duplicate entry '1' for key 'num' mysql> insert into stu values(null, "cx" ); ERROR 1048 (23000): Column 'num' cannot be null mysql> desc stu; 查看表结构 +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | num | int(11) | NO | PRI | NULL | | | name | varchar(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) |
主键约束:primary key
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | mysql> drop table stu; Query OK, 0 rows affected (0.03 sec) mysql> create table stu(num int primary key,name varchar(11)); Query OK, 0 rows affected (0.04 sec) mysql> desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | num | int(11) | NO | PRI | NULL | | | name | varchar(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> insert into stu values(null, "cx" ); ERROR 1048 (23000): Column 'num' cannot be null mysql> insert into stu values(1, "cx" ); Query OK, 1 row affected (0.01 sec) mysql> insert into stu values(1, "cx" ); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' |
创建一张一列数据为自增长的数据;且设置主键约束
MySQL为用户提供了一种方式,主键由mysql帮你生成。也就是自动增长。一般数字类型主键配合mysql的自动增长策略,这个自动增长只是策略并不是约束。主键约束:primary;自动增长名称:auto_increment
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | mysql> drop table stu; Query OK, 0 rows affected (0.04 sec) mysql> create table stu(num int primary key auto_increment,name varchar(11)); Query OK, 0 rows affected (0.41 sec) mysql> desc stu; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | num | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(11) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) |
插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | mysql> insert into stu(name) values( 'zhaoruidong' ); Query OK, 1 row affected (0.03 sec) mysql> insert into stu(name) values( 'chenxi' ); Query OK, 1 row affected (0.05 sec) mysql> insert into stu(name) values( 'cx' ); Query OK, 1 row affected (0.01 sec) mysql> select * from stu; +-----+-------------+ | num | name | +-----+-------------+ | 1 | zhaoruidong | | 2 | chenxi | | 3 | cx | +-----+-------------+ 3 rows in set (0.00 sec) |
外键约束--clazz表num字段必须为主键
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | mysql> create table clazz(num int primary key auto_increment,name varchar(11)); Query OK, 0 rows affected (0.41 sec) mysql> create table stu(num int primary key auto_increment,name varchar(11),clazznum int, foreign key(clazznum) references clazz(num)); Query OK, 0 rows affected (0.24 sec) mysql> desc clazz; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | num | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(11) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> desc stu; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | num | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(11) | YES | | NULL | | | clazznum | int(11) | YES | MUL | NULL | | +----------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) --primary key --auto_increment --foreign key(clazznum) #外键约束,约束哪一个字段 --references clazz(num)) #stu表clazznum字段参考clazz表的num字段 注意:在MySQL中外键必须是另一张表的主键 |
插入数据测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | mysql> insert into stu values(1, 'zhang' ,1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`chenxi`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`clazznum`) REFERENCES `clazz` (`num`)) # 因为clazz表num字段里没有1 mysql> insert into clazz values(1, 'one' ); Query OK, 1 row affected (0.41 sec) #在clazz表里插入一条为1 的数据 mysql> insert into stu values(1, 'zhang' ,1); Query OK, 1 row affected (0.11 sec) # 因为clazz表里num字段为1, mysql> insert into stu values(1, 'zhang' ,2); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' # 因为clazz表里num字段没有为2的数据 mysql> insert into stu values(2, 'zhao' ,1); Query OK, 1 row affected (0.00 sec) mysql> select * from clazz; +-----+------+ | num | name | +-----+------+ | 1 | one | +-----+------+ 1 row in set (0.02 sec) mysql> select * from stu; +-----+-------+----------+ | num | name | clazznum | +-----+-------+----------+ | 1 | zhang | 1 | | 2 | zhao | 1 | +-----+-------+----------+ 2 rows in set (0.00 sec) |
草都可以从石头缝隙中长出来更可况你呢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏