ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-08-16 18:32:38  阅读:224  来源: 互联网

标签:name int 表与表 外键 id key 主键


目录

约束条件

一、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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有