python学习笔记 day44 表与表之间的关系

 

 

  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;

运行结果:
python学习笔记 day44 表与表之间的关系

设计汽车表(多:外键约束)

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;

 运行结果:
python学习笔记 day44 表与表之间的关系

这样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;

运行结果:

 python学习笔记 day44 表与表之间的关系

创建学生表(多,需要对关联字段-就是学生表中需要记录该名学生属于哪个班级,添加外键约束)

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;

运行结果:


python学习笔记 day44 表与表之间的关系

这样两张表就建立了一对多的关系,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;

运行结果:
python学习笔记 day44 表与表之间的关系

创建身份证信息表:

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;

运行结果:
python学习笔记 day44 表与表之间的关系

这样两张表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;

运行结果:
python学习笔记 day44 表与表之间的关系

创建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;

运行结果:
python学习笔记 day44 表与表之间的关系

 

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;

运行结果:
python学习笔记 day44 表与表之间的关系

 创建实体表课程表:

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;

运行结果:
python学习笔记 day44 表与表之间的关系

创建关系表(反映两张实体表多对多关系的关系表):

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;

运行结果:

python学习笔记 day44 表与表之间的关系