Python 外键 表中字段修改

外键

一 作用:

1.建立表与表之间的关系

2.节省存储空间

3.组织结构清晰

4.提高拓展性

二 如何确定标语表之间的关系

  确立表与表之间的关系 一定要换位思考(必须两方都考虑周全之后才能得出结论)

三 外键语法

    foreign key(本表字段名) references 被关联表名(字段名)
    on update cascade # 级联更新
    on delete cascade # 级联删除
View Code

 

一对多(单方向的一对多)

1.

2.

以员工表和部门表为例:
# 1    先站在员工表看能否有多个员工对应一个部门
#        翻译过来:
#           一个部门能否有多个员工
#           可以!!!(暂时只能确定员工单向多对一部门)
#  2.   再站在部门表看能否有多个部门对应一个员工
#        翻译过来:
#           一个员工能否属于多个部门
#           不可以!!!
#  结论:员工表和部门表之间仅仅是单向的多对一
#  那么它们的表关系就是"一对多"
#  表关系中没有多对一一说,只有一对多
#  (无论是多对一还是一对多都叫"一对多")

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


        create table emp(
            id int primary key auto_increment,
            emp_name varchar(64),
            emp_gender enum('male','female','others') default 'male',
            dep_id int,

            foreign key(dep_id) references dep(id)
        );
View Code
            create table dep(
                id int primary key auto_increment,
                dep_name varchar(32),
                dep_desc varchar(128)
            );


            create table emp(
                id int primary key auto_increment,
                emp_name varchar(64),
                emp_gender enum('male','female','others') default 'male',
                dep_id int,
                foreign key(dep_id) references dep(id) # 外键
                on update cascade #     级联更新
                on delete cascade # 级联删除
            );
View Code

 

3.

#1.一对多的外键字段, 建在多的一方

# 2.级联:同时删除,同时更新

 

# foreign key会带来什么样的效果?
# 1、在创建表时,先建被关联的表dep,才能建关联表emp
create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);

create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)
);
# 2、在插入记录时,必须先插被关联的表dep,才能插关联表emp
insert into dep(dep_name,dep_comment) values
('sb教学部','sb辅导学生学习,教授python课程'),
('外交部','老男孩上海校区驻张江形象大使'),
('nb技术部','nb技术能力有限部门');

insert into emp(name,gender,dep_id)  values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);

# 当我想修改emp里的dep_id或dep里面的id时返现都无法成功
# 当我想删除dep表的教学部的时候,也无法删除
# 方式1:先删除教学部对应的所有的员工,再删除教学部
# 方式2:受限于外键约束,导致操作数据变得非常复杂,能否有一张简单的方式,让我不需要考虑在操作目标表的时候还需要考虑关联表的情况,比如我删除部门,那么这个部门对应的员工就应该跟着立即清空

# 先把之前创建的表删除,先删员工表,再删部门表,最后按章下面的方式重新创建表关系
# 3.更新于删除都需要考虑到关联与被关联的关系>>>同步更新与同步删除
create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);

create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)
    on update cascade
    on delete cascade
);
insert into dep(dep_name,dep_comment) values
('sb教学部','sb辅导学生学习,教授python课程'),
('外交部','老男孩上海校区驻张江形象大使'),
('nb技术部','nb技术能力有限部门');

insert into emp(name,gender,dep_id)  values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);

# 删除部门后,对应的部门里面的员工表数据对应删除
# 更新部门后,对应员工表中的标示部门的字段同步更新
级联分析

 

#3.外键约束
  # 1.在创建表的时候 必须先创建被关联表
 # 2.插入数据的时候 也必须先插入被关联表的数据

 

 

多对多(双方向的一对多)

2.

# 图书表与作者表之间的关系
"""
仍然站在两张表的角度:
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
            );
        create 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
        );
View Code

3.

#1.多对多关系:用第三张表来关联两张表

一对一(双方向都不是一对多)

 

2.客户表和学生表(老男孩的客户与学生之间,报名之前都是客户,只有报了名的才能是学生)

3.

    create table authordetail1(
            id int primary key auto_increment,
            phone int,
            addr char(255)

    );







    create table author1(
        id int primary key auto_increment,
        name char(4),
        age int,
        authordetail_id int unique,
        foreign key(authordetail_id) references authordetail1(id)
        on update cascade
        on delete cascade
    );
View Code

4.

#1.一对一关系的表:外键随便加到任何一张表里,但通常加到查询频率高的表中

#2.双方向都不是一对多关系的表,可能是一对多关系,也可能两张表里没关系。

二 修改表

# mysql对大小写不敏感!!!
语法:
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 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
      ALTER TABLE 表名 
                          CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
View Code

三 复制表

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

# 复制表结构+记录 (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;
View Code

 

posted @ 2019-08-20 16:11  心慌得初夏  阅读(773)  评论(0编辑  收藏  举报
levels of contents