数据库表与表之间的一对一、一对多、多对多关系

时间:2021-07-26 04:19:44

  表1 foreign key 表2
  
  多对一:表 1 的多条记录对应表 2 的一条记录
  
  利用foreign key的原理我们可以制作两张表的多对多,一对一关系
  
  多对多:
  
  表1的多条记录可以对应表2的一条记录
  
  表2的多条记录也可以对应表1的一条记录
  
  一对一:
  
  表1的一条记录唯一对应表2的一条记录
  
  1、先确立关系
  
  2、找到多的一方,把关联字段写在多的一方
  
  一、多对一或者一对多
  
  1.先建被关联的表,保证被关联表的字段必须唯一。
  
  2.在创建关联表,关联字段一定保证是要有重复的。
  
  一个书和出版社的一个例子,书要关联出版社(多个书可以是一个出版社,一个出版社也可以有好多书)。
  
  谁关联谁就是谁要按照谁的标准。
  
  从这里看出来,书是关联者,出版社是被关联者。
  
  书要关联出版社
  
  被关联的表
  
  create table press(
  
  id int primary key auto_increment,
  
  name char(20)
  
  );
  
  关联的表
  
  create table book(
  
  book_id int primary key auto_increment,
  
  book_name varchar(20),
  
  book_price int,
  
  press_id int,
  
  constraint Fk_pressid_id foreign key(press_id) references press(id)
  
  on delete cascade
  
  on update cascade
  
  );
  
  插记录
  
  insert into press(name) values(‘新华出版社‘),
  
  (‘海燕出版社‘),
  
  (‘摆渡出版社‘),
  
  (‘大众出版社‘);
  
  insert into book(book_name,book_price,press_id) values(‘Python爬虫‘,100,1),
  
  (‘Linux‘,80,1),
  
  (‘操作系统‘,70,2),
  
  (‘数学‘,50,2),
  
  (‘英语‘,103,3),
  
  (‘网页设计‘,22,3);
  
  结果:
  
  二、一对一
  
  用户和管理员(只有管理员才可以登录,一个管理员对应一个用户)
  
  用户被关联
  
  先建被关联的表
  
  create table user(
  
  id int primary key auto_increment, #主键自增
  
  name char(10)
  
  );
  
  在建关联表
  
  create table admin(
  
  id int primary key auto_increment,
  
  user_id int unique,
  
  password varchar(16),
  
  foreign key(user_id) references user(id)
  
  on delete cascade
  
  on update cascade
  
  );
  
  insert into user(name) values(‘susan1‘),
  
  (‘susan2‘),
  
  (‘susan3‘),
  
  (‘susan4‘),
  
  (‘susan5‘),
  
  (‘susan6‘);
  
  insert into admin(user_id,password) values(4,‘sds156‘),
  
  (2,‘531561‘),
  
  (6,‘f3swe‘);
  
  结果:
  
  三、多对多
  
  书和作者(我们可以再创建一张表,用来存book和author两张表的关系)
  
  要把book_id和author_id设置成联合唯一
  
  联合唯一:unique(book_id,author_id)
  
  联合主键:alter table t1 add primary key(id,avg)
  
  关联方式:foreign key 一张新表
  
  #被关联的
  
  create table book1(
  
  id int primary key auto_increment,
  
  name varchar(10),
  
  price float(3,2)
  
  );
  
  #========被关联的
  
  create table author(
  
  id int primary key auto_increment,
  
  name char(www.hxyl1618.com )
  
  );
  
  #========关联的
  
  create table author2book(
  
  id int primary key auto_increment,
  
  book_id int not null,
  
  author_id int not null,
  
  unique(book_id,author_id),
  
  foreign key(book_id) references book1(id)
  
  on delete cascade
  
  on update cascade,
  
  foreign key(author_id) references author(id)
  
  on delete cascade
  
  on update cascade
  
  );
  
  #========插入记录
  
  insert into book1(name,price) values(‘九阳神功‘,9.9),
  
  (‘葵花宝典‘,9.5),
  
  (‘辟邪剑谱‘,5),
  
  (‘降龙十巴掌‘,7.3);
  
  insert into author(name) values(www.haoranpkk.cn‘egon‘),(www.chuanchenpt.cn‘e1‘),(‘e2‘),(‘e3‘),(‘e4‘);
  
  insert into author2book(book_www.yingchenyl.com id,author_www.yinchengyule.cn id) values(1,1),
  
  (1,4),
  
  (2,1),
  
  (2,5),
  
  (3,2),
  
  (3,3),
  
  (3,4),
  
  (4,5);
  
  总结:
  
  在一对一中,unique 在关联表中