MySQL之Foreign_Key

 

MySQL之Foregin_Key

  一\\一对多

一.员工表和部门表
        dep  emp
        类似与我们将所有的代码都写在一个py文件内 
        确立标语表之间的关系 
        思路:一定要要换位思考问题(必须两方都考虑周全之后才能得出结论)

思路:一定要要换位思考问题(必须两方都考虑周全之后才能得出结论)

1.先站在部门表中看能否有多个部门对应一个员工

1.先站在部门表中看能否有多个部门对应一个员工 
            翻译过来就是:一个员工能否有多个部门
            很显然不可以!!!
          在站在员工表中看能否有多个员工对应一个部门
            翻译过来:
            很显然是可以的!!!
          所以员工表和部门表之间仅仅打火机单向事务多对一
          他们的表关系就是"一对多"
          表关系中没有"多对一"的说法,都是"一对多"

  让两个表代码层面上的真正的关联,就是必须使用外键

2,让两个表代码层面上的真正的关联,就是必须使用外键
           什么是外键呢>>> 让表与表之间有硬性关系
           foreign key 注意这里是没有下滑线的
           foreign key 
                外键约束
                1.在创建表的时候,必须先创建被关联系
                2.插入数据的时候 也必须先插入被关联表的数据

  建表# 被关联

create table dep(id int primary key auto_increment,
                dep_name varchar(32),
                dep_desc varchar(128));

  在建 关联表 注意加级联级删除(同事更新,更新的是直接关联的表)

emp_name varchar(32),
                emp_gender enum("male","female","other") default "male",
                dep_id int,
                foreign key(dep_id) references dep(id)
                on update cascade 
                on delete cascade);

# 注意的是的外键是一个完整的语句 关联的是所在表的外键id 
  应用到真正关联的表.级联级更新级联删除


  插入数据 先插入被关联的表的具体数据 id 是自动自增所以不用添加

    insert into dep(dep_name,dep_desc_) values('教学部','教书育人'),
                ('技术部','技术部门'),
                ('外交部','形象大使');

  # 注意:表字段要写好细节

  # 插入具体值到关联表

insert into emp(emp_name,emp_gender,dep_id) values(
                'koko','male',1),
                ('jason','male',2),
                ('tank','female',3),
                ('egon','male',3);l

  二\\多对多

  多对多 思路:换为思考

                如:书籍和作者
                1.先站在书籍的角度看问题
                  多本书能否被一个作者写
                  # 翻译一个作者能否写多本书 很显然是可以的>>>一对多
                2.再站在书籍的角度看问题
                  多个作者能否同写一本书 
                  一本书能否被多个作者写  很显然也是可以的>>>一对多
                  综合上述 多对多
                
                # 注意:多对多需要建立第三张关联书籍和作者的这两张表
                确定好关系之后开始建表
                所以建表的时候么有要求先建立那张表

建表:

  书籍表

create table book(id int primary key auto_increment,
                title varchar(32),
                price int);

  作者表

                create table author(id int primary key auto_increment,
                name varchar(32),
                age int);

  #  多对多关系的建立 必须手动创建第三张关联表

reate 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);
                # 注意完整的一句话哈

  #开始在表中插入数据

insert into author(name,age) values('koko',18),('mye',20),
                ('tank',28);

  # 插入第三张表的关联数据

insert  into book2author(book_id,author_id) 
                values(1,2),(1,3),(2,1),(2,2),(3,2);
        

  三\\一对一

  这个很简单的吧 就是把一个人的一张表拆分成两张表

  节省内存 和查询的效率问题
  一般foreign key 建在查询的比较多的一方

  比如一个人的信息表

  # 还是先建立被关联的表

create table authordetail(id int primary key auto_increment,
            phone int ,
            addr varchar(255));

  # 注意:括号 完整性

  # 关联表 注意唯一性 unique

create table author1(id int primary key auto_increment,
            name varchar(32),
            age int,
            authordetail_id int unique,
            foreign key(authordetail_id) references authordetail(id)
            on update cascade 
            on delete cascade);

  # 插入数据
  # 先插被关联表也就是详情表 

insert into authordetail(phone,addr) values
(131,'广西'),
('132','东莞'),
(133,'山西');

  # 再插入主关联表

insert into author1(name,age,authordetail_id) values
('koko',18,1),
('tank',20,2),
('jason',20,3);

  四\\总结语法

判断表关系的最简单的语法
        图书与出版社
            一本书可不可以有多个出版社  不可以!!!
            一个出版社可不可以出版多本书  可以!!!
            一对多的关系
        
        
        图书与作者表
            一本书可不可以有多个作者    可以!!!
            一个作者可不可以写多本书     可以!!!
            多对多的关系
        
        
        作者与作者详情
            一个作者可不可以有多个详情  不可以!!!
            一个作者详情可不可以有多个作者  不可以!!!
             要么两者是一对一
             要么两者之间没任何关系

  五\\了解知识点:

  

1.修改表的完整语句
            1. 修改表名  
                  ALTER TABLE 表名 
                                      RENAME 新表名;
            2. 增加字段
                  ALTER TABLE 表名
                                      ADD 字段名  数据类型 [完整性约束条件…],
                                      ADD 字段名  数据类型 [完整性约束条件…];
                  ALTER TABLE 表名
                                      ADD 字段名  数据类型 [完整性约束条件…]  FIRST;  # 直接移到最前面
                  ALTER TABLE 表名 
                                      ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;  # 寻找插哪个字段的后面                    
            3. 删除字段
                  ALTER TABLE 表名 
                                      DROP 字段名;
            4. 修改字段  # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
                  ALTER TABLE 表名 
                                      MODIFY  字段名 数据类型 [完整性约束条件…];
                  ALTER TABLE 表名 
                                      CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
  六\\复制表

# 查询语句执行的结果也是一张表,可以看成虚拟表

            # 复制表结构+记录 (key不会复制: 主键、外键和索引)
            create table new_service select * from service;

            # 只复制表结构
            select * from service where 1=2;        //条件为假,查不到任何记录

            create table new1_service select * from service where 1=2;  

            create table t4 like employees;
                    

  七\\作业

 练习:账号信息表,用户组,主机表,主机组

#用户表
create table user(
id int not null unique auto_increment,
username varchar(20) not null,
password varchar(50) not null,
primary key(username,password)
);

#用户组表
create table usergroup(
id int primary key auto_increment,
groupname varchar(20) not null unique
);

#主机表
create table host(
id int primary key auto_increment,
ip char(15) not null unique default '127.0.0.1'
);

#业务线表
create table business(
id int primary key auto_increment,
business varchar(20) not null unique
);

#建关系:user与usergroup

create table user2usergroup(
id int not null unique auto_increment,
user_id int not null,
group_id int not null,
primary key(user_id,group_id),
foreign key(user_id) references user(id),
foreign key(group_id) references usergroup(id)
);

#建关系:host与business
create table host2business(
id int not null unique auto_increment,
host_id int not null,
business_id int not null,
primary key(host_id,business_id),
foreign key(host_id) references host(id),
foreign key(business_id) references business(id)
);

#建关系:user与host
create table user2host(
id int not null unique auto_increment,
user_id int not null,
host_id int not null,
primary key(user_id,host_id),
foreign key(user_id) references user(id),
foreign key(host_id) references host(id)
);

  练习:

# 班级表
cid    caption
# 学生表
sid sname gender class_id
# 老师表
tid    tname
# 课程表
cid    cname    teacher_id
# 成绩表
sid    student_id course_id number

猜你喜欢

转载自www.cnblogs.com/mofujin/p/11383617.html
今日推荐