MySQL——约束条件
MySQL——约束条件
目录
- 约束条件——主键
- 约束条件——外键
约束条件——主键
-
primary key主键
-
单从约束角度上而言主键等价于非空且唯一 not null unique
create table t1( id int primary key, name varchar(32) );
-
InnoDB存储引擎规定一张表必须有且只有一个主键
2.1. 如果创建的表中没有主键也没有非空且唯一的字段 那么InnoDB存储引擎会自动采用一个隐藏的字段作为主键(主键可以加快数据查询:新华字典的目录) 2.2.如果创建的表中没有主键但是有非空且唯一的字段 那么InnoDB存储引擎会自动将该字段设置为主键 ~~~python create table t2( nid int not null unique, sid int not null unique, uid int not null unique, name varchar(32) ); ~~~
- 创建表的时候都应该有一个'id'字段 并且该字段应该作为主键
如:uid、sid、pid、gid、cid、id
- 单列主键和联合主键
针对主键有且只有一个主键从而产生 | 主键 | 表示 | | :------: | :---------------------------------------: | | 单列主键 | id int primary key | | 联合主键 | sid int,nid int,<br>primary key(sid, nid) | 联合主键也是属于单列主键的,同样符合有且只有一个主键
-
-
auto_increment自增
-
该约束条件不能单独使用 必须跟在键后面(主要配合主键一起使用)
create table t3( id int auto_increment ); there can be only one auto column and it must be defined as a key create table t4( id int primary key auto_increment, name varchar(32) );
-
自增的特点
自增的操作不会因为执行删除数据的操作而回退或者重置
如果非要重置主键 需要格式化表
操作 方法 删除数据 delete from 格式化数据 truncate 表名; 删除表的数据并不是删除主键值,而格式化数据在删除表的同时也将该表的主键值也删除
-
约束条件——外键
-
外键简介
1.外键的含义
外键与主键相对,作用就是通过主外键的之间关系使对张表中的数据更好的关联。
2.外键的特点
从表 外键 的值是对主表 主键 的引用。
从表外键类型,必须与主表主键类型一致。
3.外键的作用
主键可以引用外键来保证数据的完整性和一致性
具体可以理解为
用外键来承接一个表,让主表可以引用外键的表来达到数据的完整性
-
外键字段的创建
1.什么是外键字段
外键字段是用来记录表与表之间数据的关系
2.数据之间的关系
一对多、多对多、一对一、没有关系
3.表数据关系的判定
要懂得换位思考
表关系 判断 事例 外键字段的建立 一对多 一个属于另一个
另一个不属于这个一个学生对一个教室
一个教室可以有多个学生建在多的一方 多对多 二者都可属于另一个 一个学生被多个老师教授
一个教师教授多个学生建在单独
开设的第三个表一对一 二者都不属于另一个 一个学生对应一个学号
一个学号只能对应一个学生建在任意表
建议建在查询率高没得关系 二者无关系 一个学生和另一个学校
(学生与所在的学校有关系,
但与其他学校没关系)NULL -
外键(Foreign Key)
1.表中存在外键的时候,写sql语句时的顺序
(1)先写普通字段
(2)然后再写 外键字段
2.编写普通字段
举例一对多: create table emp( id int primary key auto_increment, name varchar(32), gender enum('male','female','others') default 'male', dep_id int, foreign key(dep_id) references dep(id) ); create table dep( id int primary key auto_increment, dep_name varchar(32), dep_desc varchar(32) );
(1)创建表的时候需要先创建被关联的表(没有外键) 然后再是关联表(有外键)
(2)插入表数据的时候 针对外键字段只能填写被关联表字段已经出现过的数据值
(3)被关联字段无法修改和删除3.关联表
create table emp1( id int primary key auto_increment, name varchar(32), gender enum('male','female','others') default 'male', dep_id int, foreign key(dep_id) references dep1(id) on update cascade # 级联更新 on delete cascade # 级联删除 ); create table dep1( id int primary key auto_increment, dep_name varchar(32), dep_desc varchar(32) );
级联更新、级联删除
被关联数据一旦变动 关联的数据同步变动4.实际情况中外键的情况
在实际工作中 很多时候可能并不会使用外键
因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
我们为了能够描述出表数据的关系 又不想使用外键
自己通过写SQL 建立代码层面的关系 -
表关系之多对多
针对多对多表关系 外键字段不能建在任意一方!!!
所以,需要单独开设第三张关系表 存储数据关系
create table book( id int primary key auto_increment, title varchar(32), author_id int, foreign key(author_id) references author(id) on update cascade # 级联更新 on delete cascade # 级联删除 ); create table author( id int primary key auto_increment, name varchar(32), book_id int, foreign key(book_id) references book(id) on update cascade # 级联更新 on delete cascade # 级联删除 );
开设第三张关系表 存储数据关系
create table book( id int primary key auto_increment, title varchar(32) ); create table author( id int primary key auto_increment, name varchar(32) ); create table book2author( id int primary key auto_increment, book_id int, foreign key(book_id) references book(id) on update cascade # 级联更新 on delete cascade, # 级联删除 author_id int, foreign key(author_id) references author(id) on update cascade # 级联更新 on delete cascade # 级联删除 );
-
表关系之一对一
针对'一对一'的表关系 外键字段建在任何一张表都可以 但是建议你建在查询频率较高的表中便于后续查询
create table user( id int primary key auto_increment, name varchar(32) detail_id int unique, foreign key(detail_id) references userDetail(id) on update cascade # 级联更新 on delete cascade # 级联删除 ); create table userDetail( id int primary key auto_increment, phone bigint );
一对一的关系需要考虑确定数据之间关系的唯一性 unique
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!