1. 表与表之间的关系:一对多;一对一;多对多;
表与表之间怎么建立一对一的关系呢,可以使用外键约束+唯一约束;
有两种方式:
1.利用主键,一张表的主键只能有一个,所以这张表就可以满足唯一,另一张表跟前面那张表的主键关联的字段设置为外键,并且该外键字段设置为唯一字段(也就是当两张表关联的两个字段之一是一张表的主键,则另一张表相应字段设置为外键+唯一约束即可);---用户-博客表(假设一个用户只能有一个博客)
2. 外键与普通字段:普通字段加唯一约束,外键字段设置为外键 加唯一约束,也就是如果是两张表的关联字段都不是主键,则两张表的一张表关联字段设置为唯一约束,另一张表的关联字段设置为外键约束(外键必须是前一张表的主键)+唯一约束----身份证 -人员信息表;
2. 一对多: (一的表正常创建,多的表关联字段添加外键)
2.1 场景: 人-汽车表(一个人可以拥有很多部汽车) person表就是一,汽车表就是多, 另外创建一的那张表就正常创建,设置主键就好了;而多那张表需要设置外键约束(跟前面那张表的主键约束);
首先创建人员信息表:
create table person( id varchar(10) not null PRIMARY key, # 人员信息表的主键 其实是跟car表关联的字段 name varchar(20) not null, age int not null, sex int not null) alter table person modify sex char(2) not null; insert into person values("P0001","西西",22,"女"); insert into person values("P0002","东东",23,"男"); insert into person values("P0003","楠楠",24,"女"); select * from person;
运行结果:
设计汽车表(多:外键约束)
create table car( cid varchar(10) not null primary key, # car表中的主键 name varchar(20) not null default "大众" , p_id varchar(10) not null, # car表中跟person表中关联的字段,需要设置为外键约束 constraint fk_pid foreign key(p_id) references person(id)) # 设置为外键约束(关联另一张表person的主键id) insert into car values("c0001","大众","P0001"); # 这两个车都是属于同一个人P0001 insert into car values("c0002","奔驰","P0001"); # 这两个车都是属于同一个人P0001 insert into car values("c0003","奥迪","P0002"); # c0002车属于P0002这个人 insert into car values("c0004","奥迪","P0003"); select * from car;
运行结果:
这样person表和car表就建立了一对多的关系,person表的id 是该表的主键,也是跟car这张表的关联字段,car这张表也有一个主角,就是car的id,但是car这张表的p-id就是所属人id 代表这个车属于哪个车主,需要设置为外键约束(这样car这种表的p-id 多条数据可以具有相同的p-id 表示多辆车具有相同的车主,一个人拥有多部车)
2.2 场景: 班级-学生表,一个班级可以对应很多学生,就是一对多,所以class 表正常建立,student表需要对关联字段创建外键约束;
创建班级表(一,需要设置主键,并且这个主键是两张表的关联字段)
create table class( id varchar(10) not null primary key, # 班级id设置为主键,其实也是两张表的关联字段 c_name varchar(30) not null) insert into class values("C0001","python课程班级"); insert into class values("C0002","java课程班级"); select * from class;
运行结果:
创建学生表(多,需要对关联字段-就是学生表中需要记录该名学生属于哪个班级,添加外键约束)
create table student( id varchar(10) not null primary key, name varchar(30) not null, age int not null default 22, sex char(2) not null default "女", c_id varchar(20) not null, # student表中的外键,关联的是class表中的班级id(主键)所以多student表中添加外键约束即可; constraint fk_student_cid foreign key(c_id) references class(id) # 对student表中的c_id设置外键约束,关联的是class表的班级id # 需要注意 student表的外键c-id 必须跟class表的主键id数据类型一样~~ ) insert into student values("S0001","西西",22,"女","C0001"); # S0001 S0002属于同一个班级,student表的c-id字段可以重复(也就是多) insert into student values("S0002","静静",23,"女","C0001"); insert into student values("S0003","东东",24,"男","C0002"); insert into student values("S0004","二狗子",25,"男","C0002"); select * from student;
运行结果:
这样两张表就建立了一对多的关系,class的id 是主键唯一,student表的关联字段是c-id 需要设置为外键 这样student表的c-id就可以多条数据具有相同的值,也就是很多个学生可以同属于一个班级(一个班级具有很多学生--一对多)
3. 一对一
表与表之间一对一的约束关系有两种创建方法:
1. 普通字段(code)加唯一约束,关联字段(c_id)设置为外键约束加唯一约束(比如人 身份证两张表 需要表示的是一个人有一个身份证号码,但是在card表中id是主键,身份证号是普通字段,所以card表需要设置普通字段code的唯一约束,另外person表需要id就是设置为主键,但是person表需要记录身份证的信息,也就是需要给一个关联字段,关联字段又只能跟别的表的主键关联作为外键,所以person表关联字段需要设置外键+唯一约束)
2. 两张表的一其中一个是主键,另外一张表设置为外键约束和唯一约束(区别就是一是主键的那张表 不需要设置普通字段为唯一约束,因为一本来就是主键,主键本来就唯一)
3.1 场景:每一个人都只拥有一个身份证;
需要创建两张表 person人员信息表,具有id name age sex p_code (就是人员信息表都得记录每一个人所具有的身份证号的信息----这里是根据身份证card表的id来关联的,card表的id就是主键,然后code有设置为unique 所以一个id就对应一个code编号,所以在person表中查找id也能唯一的找到code) ,另一张表就是身份证信息的表 包含id code (身份证编号) 这两张表就是一对一的关系,也就是person表的c-id需要设置为外键+唯一约束,card表的code普通字段需要添加唯一约束;
创建身份证信息表card表(id 是主键(另一张表person的c-id需要关联的字段),code:普通字段,需添加唯一约束):
create table card( id varchar(10) not null primary key, # card 表的主键,person表c_id的关联字段(主键和外键数据类型必须一样,其实就是一个东西,只是在两张表中都出现) code varchar(20) not null unique # 需要为普通字段添加唯一约束,因为一对一指的就是card的code普通字段 还有person表的c-id 外键+唯一约束 ) insert into card values("C0001","129304903940"); insert into card values("C0002","232392039094"); insert into card values("C0003","403903403283"); # 三条不同的身份证信息 select * from card;
运行结果:
创建身份证信息表:
create table person_info( id varchar(10) not null primary key, # person表的主键 name varchar(20) not null, age int not null default 22, sex char(2) not null default "女", c_id varchar(10) not null unique, # 跟card表的主键id关联的字段,需要添加外键和唯一约束的 constraint fk_person_cid foreign key(c_id) references card(id)) insert into person_info values("P0001","西西",22,"女","C0003"); # P0001 对应的身份证信息是C0003那条数据; insert into person_info values("P0002","楠楠",24,"男","C0001"); insert into person_info values("P0003","宝宝",23,"女","C0002"); select * from person_info;
运行结果:
这样两张表person表和card表就通过person表的c_id外键约束+唯一约束 跟 card表的id 主键关联 与card表的code普通字段(添加唯一约束)建立了一对一的关系;
3.2 场景:假设一个用户只能有一个博客:
一张表设置主键(表的一) 另一张表外键约束+唯一约束(另一张表的一)
(其实我觉得这两张表的建立可以跟身份证信息表建立思路是一样的,就是首先创建 博客表(普通字段添加唯一约束) 然后创建人员信息表,主键id 关联字段就是人员信息表的blog-id 设置为博客表主键id的外键,并且添加唯一约束 我觉得这样也行其实,,,,)
先创建人员信息表:
create table user( id varchar(10) not null primary key, name varchar(20) not null) insert into user values("U0001","西西"); insert into user values("U0002","东东"); select * from USER;
运行结果:
创建blog表:
create table blog( id varchar(10) not null primary key, name varchar(20) not null, user_id varchar(10) not null unique, -- 两张表的关联字段,设置为外键(关联的是user表的主键id,通过外键user-id就可以唯一找到这个人 constraint blog_userid foreign key(user_id) references user(id)) -- 需要为外键添加唯一约束(这样两张表就建立一对一的关系) insert into blog values("B0001","璇璇是小仙女呀","U0002"); # 这个博客是U0002用户的 insert into blog values("B0002","小仙女哈哈哈哈","U0001"); select * from blog;
运行结果:
4. 多对多:(如果是两张表之间多对多,一般需要建立三张表,两张独立的实体表,另外一张可以建立两张表关联的关系表)
4.1 场景: 学生选课,一个学生可以选很多门课,每门课可以提供很多学生选择;
一般我们需要创建三张表,两张实体表,就是独立的学生表和课程表,另外一个就是关系表,相当于两张多对多是体表的桥梁;
首先创建实体表学生表:
create table student_info( id varchar(10) not null primary key, name varchar(20) not null, age int not null, sex char(2) not null ) insert into student_info values("S0001","璇璇",22,"女"); insert into student_info values("S0002","西西",23,"女"); insert into student_info values("S0003","东东",24,"男"); insert into student_info values("S0004","楠楠",25,"男"); select * from student_info;
运行结果:
创建实体表课程表:
create table course( id varchar(10) not null primary key, name varchar(10) not null) insert into course values("C0001","python课程"); insert into course values("C0002","java课程"); insert into course values("C0003","c++课程"); select * from course;
运行结果:
创建关系表(反映两张实体表多对多关系的关系表):
create table relation_info( s_id varchar(10) not null, c_id varchar(10) not null, primary key(s_id,c_id), # 将s_id 与 c_id设置为联合主键 分别指的是student_info表的学生id 以及course表的课程id constraint fk_relation_info_sid foreign key(s_id) references student_info(id), # 为关系表中的两个字段(其实就是另外两张表的主键,添加外键约束) constraint fk_relation_info_cid foreign key(c_id) references course(id)) insert into relation_info values("S0001","C0002"); # s00001选了C0002这门课 insert into relation_info values("S0001","C0003"); insert into relation_info values("S0001","C0001"); insert into relation_info values("S0003","C0001"); insert into relation_info values("S0003","C0002"); insert into relation_info values("S0003","C0003"); insert into relation_info values("S0002","C0002"); insert into relation_info values("S0002","C0003"); select * from relation_info;
运行结果: