数据库学习

  今天学习了多表关联、修改表、复制表和蠕虫复制

  一、多表关联:

    如何找出两张表之间的关系

    1、先站在左表的角度去找

    是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)

    2、再站在右表的角度去找

    是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段 foreign key 左表一个字段(通常是id)

    3、总结:

    多对一:

    如果只有步骤1成立,则是左表多对一右表

    如果只有步骤2成立,则是右表多对一左表

    多对多:

    如果步骤1和2同时成立,则证明这两张表是一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系

    一对一:

    如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

    建立表之间的关系

    #一对多或称为多对一

    三张表:出版社,作者信息,书

    一对多(或多对一):一个出版社可以出版多本书

    关联方式:foreign key

    

create table press(
id int primary key auto_increment,
name varchar(20)
);

create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);

insert into press(name)  values
('北京工业地雷出版社'),
('人民音乐不好听出版社'),
('知识产权没有用出版社');

insert into book(name,press_id) values
('九阳神功',1),
('九阴真经',2),
('九阴白骨爪',2),
('独孤九剑',3),
('降龙十巴掌'),
('葵花宝典',3);

  多对多

  三张表:出版社,作者信息,书

  多对多:一个作者可以写多本书,一本书也可以用多个作者,双向的一对多,即多对多

  关联方式:foreign key +一张新的表

create table auther(
id int primary key auto_increment,
name varchar(20)
);

create table book(
id int primary key auto_increment,
name varchar(20)
);

#这张表就存放作者表与书表的关系,即查询二者的关系查这表就可以了
create table author2book(
id int not null unique auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key(author_id) references author(id) 
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id,book_id)
);
#插入四个作者,id依次排开
insert into author(name) values('egon'),('alex'),
('yuanhao'),('wpq');

#插入六本书,id依次排开
insert into book(name) values('九阳神功'),
('九阴真经'),
('九阴白骨爪'),
('独孤九剑'),
('降龙十巴掌'),
('葵花宝典');

insert into author2book(author_id,book_id) values(1,1),
(1,2),
(1,3),
(1,4),
(1,5),
(1,6),
(2,1),
(2,6),
(3,4),
(3,5),
(3,6),
(4,1);

  一对一:

  两张表:学生表和客户表

  一对一:一个学生是一个客户,一个客户有可能变成一个学校,即一对一的关系

  关联方式:foreign key +unique

#一定是student来foreign key表customer,这样就保证了:
#1 学生一定是一个客户,
#2 客户不一定是学生,但有可能成为一个学生

create table customer(
id int primary key auto_increment,
name varchar(20) not null,
qq varchar(10) not null,
phone char(16) not null
);
create table student(
id int primary key auto_increment,
class_name varchar(20) not null,
customer_id int unique, #该字段一定要是唯一的
foreign key(customer_id) references customer(id)#外键的字段一定要保证unique
on delete cascade
on update cascade
);
#增加客户
insert into customer(name,qq,phone) values
('李飞机','1224542',1234567891),
('王大炮','1224542',1234567891),
('守榴弹','1224542',1234567891),
('吴坦克','1224542',1234567891),
('战地雷','1224542',1234567891);

#增加学生
insert into student(class_name,customer_id) values
('脱产3期',3),
('周末19期',4),
('周末19期',5);

  二、修改表、复制表和蠕虫复制:

    1.修改表

      add 添加字段

      modify 修改字段类型

      change 修改字段名称 或 类型

      drop 删除字段

      rename 改表名

    2.复制表

      create table 新的表名 select *from 源表名;

        数据 结构  约束不能复制

      当条件不成立时 只复制表结构

      create table 新的表名 select * from 源表名 where 1 = 2;

      create table stu_copy2 select * from student1 where 1 = 2;

    3.蠕虫复制

     即自我复制

     insert into 表名称 select *from 表名;

     如果有主键 避开主键字段

     insert into 表名称(其他字段) select 其他字段 from 表名;

     

原文地址:https://www.cnblogs.com/xiaocaiyang/p/9997405.html