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

浙公网安备 33010602011771号