其他分享
首页 > 其他分享> > 约束条件、主键、外键、表与表的的关系

约束条件、主键、外键、表与表的的关系

作者:互联网

目录

约束条件

一、primary key主键

1.单从约束角度上而言主键等价于非空且唯一 (= not null unique)

create table t1(
	id int primary key,
    name varchar(32)
);

2.InnoDB存储引擎规定一张表必须要有且只有一个主键

​ 2.1.如果创建的表中没有主键也没有非空且唯一的字段,nameInnoDB存储引擎会自动采用一个隐藏的字段作为主键(主键可以加快数据的查询:比如新华字典的目录)

​ 2.2.如果创建的表中没有主键也没有非空且唯一的字段,那么InnoDB存储引擎会自动将该字段设置为主键

create table t2(
    nid int not null unique,
    sid int not null unique,
    uid int not null unique,
    name varchar(32)
);

3.创建表的时候都应该有一个‘id’字段,并且该字段应该作为主键

uid、sid、pid、gid、cid、id

补充说明:

id int primary key 单列主键

sid int,
nid int,
primary key(sid,nid) 联合主键

二、auto_increment自增

1.介绍

该约束条件不能单独使用,必须跟在键后面(主要配合主键一起使用)

create table t3(
    id int auto_increment
);
there can be only one auto column and it must be defind as a key
create table t3(
    id int primary key auto_increment,
    name varchar(32)
);

image

image

image

2.补充说明:自增的特点

自增的操作不会因为执行删除数据的操作而退回或者重置

delete from

如果非要重置主键,需要格式化表

truncate 表名;
# 删除表数据并重置主键

三、foreign key 外键

1.外键前戏

1.1.需要创建一张员工表,有以下内容:

id 、name、gender、dep_name、dep_desc

1.2.上述表的缺陷

表结构不清晰,到底是员工表还是部门表

字段数据反复存取,浪费存储空间

表的扩展性差,牵一发动全身,效率极低

1.3.优化操作 >>>: 拆表

员工表:id 、name、gender
部门表:id 、dep_name、dep_desc
# 拆表之后解决了上述三个问题,但是出现了一个致命问题,两张表,不能够互相设为外键

'''解决措施:另建一张表'''
id name gender dep_id
添加一个部门编号字段填写部门数据的主键值
外键字段:专门用于记录表与表之间数据的关系

2.介绍

外键字段使用来记录表与表之间数据的关系,而数据的关系有四种:

一对多关系、多对多关系、一对一关系、没有关系

四、表与表之间的关系

1.表数据关系的判定方法 >>>:'换位思考'

2.一对多关系

2.1.以员工表和部门表为例

1.站在员工表的角度
	问:一条员工数据能否对应多条部门数据?
		== 一名员工是否能隶属于多个部门?
	答:不可以
2.站在部门表的角度
	问:一个部门数据能否对应多条员工数据?
		== 一个部门是否可以拥有多个员工?
	答:可以
换位思考之后得出的答案,一个可以一个不可以
那么表的关系就是:'一对多'
	部门是一,员工是多
针对'一对多'的关系,外键字段建在多的一方

2.2.代码演示

1.先写普通字段
2.再写外键字段

create table emp(
    id int primary key auto_increment,
    name varchar(32),
    gender enum('male','female','otherrs') default 'male',
    dep_id int,
    forgin key(dep_id) references dep(id)
); 
creat table dep(
    id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(32)
);

'''
1.创建表的时候需要先创建被关联的表(没有外键),然后是关联表(有外键)
2.出入表数据的时候,针对外键字段只能是填写被关联表字段已经出现过的数据值
3.被关联字段无法修改和删除,操作限制性太强,有点不太好
'''

"""
级联更新、级联删除:
	被关联对象一旦变动,滚立案的数据同步变动
	
"""
create table emp1(
    id int primary key auton_increment,
    name varchar(32),
    gender enum('male','female','others') default 'male',
    dep_id int,
    foreigin key(dep_id) references dep(id)
    on update cascade  # 级联更新
    on delete cascade  # 级联删除
);
creat table dep1(
    id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(32)
);

'''
扩展:
	在实际工作中,很多时候可能不会使用外键
	因为外键增加了表之间的耦合性,不便于单独操作,资源消耗增加
	我们为了能够描述出表数据之间的关系,又不想使用外键
	我们可以通过写SQL,建立代码层面的关系
'''

3.多对多关系

3.1.以书籍表和作者表为例

1.站在书籍表的角度
	问:一条书籍数据能否对应多条作者表数据?
    	== 一本书是否可以有多个作者?
	答:可以
2.站在作者表的角度
	问:一条作者数据是否能对应多条书籍表数据?
    	== 一个作者是否可以有多本书?
	答:可以
总结:两边都可以对应多条数据,name表数据关系就是'多对多'
针对'多对多'关系,外键字段不能健在任意一方!!!

3.2.代码演示

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,
    foregin key(book_id) references book(id)
    on update cascade  # 级联更新
    on delete cascade  # 级联删除
);

'''需要单独开设第三张表来存储数据关系'''
create table book(
    id int primary key suto_increment,
    title varchar(32)
);
creat table author(
    id int primary key auto_increment,
    name varvchar(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
);

4.一对一关系

4.1.以用户表和用户详情表为例

1.站在用户表角度
	问:一条用户表数据能否对应多条用户详情表数据?
    	== 一个用户是否有多个用户详情?
    答:不可以
2.站在用户详情表角度
	问:一条用户详情表数据能否对应多条用户表数据?
    	== 一个用户详情是否能是多个用户的?
    答:不可以
总结:两边都不可以,先考虑是不是没有关系
	如果有关系那就是'一对一'
针对'一对一'关系的表,外键字段建在任何一张表都可以
但是建议建在查询频率比较高的表,便于后期查询

4.2.代码演示

create table user(
    id int perimary ket 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
);

标签:name,int,表与表,外键,id,key,主键
来源: https://www.cnblogs.com/Zhang614/p/16592510.html