zoukankan      html  css  js  c++  java
  • mysql 外键的使用

                外键(foreign key)

    概念

    foreign key,外面的主键,其他表的主键!

    如果一个实体A的某个字段,刚好指向或者引用另一个实体B的主键,那么实体A的这个字段就是叫作外键!

    作用

    外键的意义就是用来约束关系内的实体!

    思考:

    为什么要有外键约束?

    因为比较符合现实中正常的业务逻辑!

    假如上面的学生表中的班级字段出现了一个11班,就不符合逻辑,因为班级表中根本就没11班!

     所以,外键的约束主要体现在以下的两个方面:

    1, 增加子表记录的时候,是否有与之对应的父表记录!

    2, 当删除或更改主表记录的时候,从表应该如何处理相关的记录!

    定义

    语法形式: foreign key(子表的字段名)    references 父表(父表的主键) 

     -- -------------------外键(建表后再添加)--------------------------------------------------------------------

    create table student(       -- |

    stu_id tinyint unsigned auto_increment primary key,               -- |

    stu_name varchar(10) not null default '',             -- |

    stu_tea_id tinyint unsigned      -- |

    )engine=innodb default charset=utf8;        -- |

            -- |

    create table teacher(        -- |

    tea_id tinyint unsigned auto_increment primary key,        -- |

    tea_name varchar(10) not null        -- |

    )engine=innodb default charset=utf8;        -- |

    alter table student add foreign key(stu_tea_id) references teacher(tea_id);                  -- |

    -- -----------------------------------------------------------------------------------------------------------------

    -- -------------------外键(建表时添加)--------------------------------------------------------------------------------

    #这种方式必须先添加父表再添加子表                          -- |

    #父表                                 -- |

    create table teacher(          -- |

    tea_id tinyint unsigned auto_increment primary key,                  -- |

    tea_name varchar(10) not null          -- |

    )engine=innodb default charset=utf8;                  -- |

    #子表  -- |

    create table student(          -- |

    stu_id tinyint unsigned auto_increment primary key,                  -- |

    stu_name varchar(10) not null default '',                          -- |

    stu_tea_id tinyint unsigned,               -- |

    foreign key(stu_tea_id) references teacher(tea_id)       -- |

    )engine=innodb default charset=utf8;               -- |

    -- --------------------------------------------------------------------------------------------------------------------------

    思考:

    此时应该先插入父表的数据还是子表的数据?

    应该先插入父表的数据!

    添加数据

    以上,只是外键约束的一个方面:就是增加子表记录的时候,是否有与之对应的父表记录!

    还有一个方面:就是当删除或更改主表记录的时候,从表应该如何处理相关的记录!

    此时,我们就需要设置相关的级联操作!

    设置级联

     所谓的级联操作,就是在操作一张表的时候,会影响到另一张表,也叫作关联操作或关联动作!

    一般分成以下的两个操作:

    主表更新

    语法形式为:on update[级联操作]

    主表删除

    语法形式为:on delete[级联操作]

    我们应该在定义一个外键的时候顺便设置级联操作!所以同样应该在子表上进行设置!

    这里的级联操作常见的有三种形式:

    cascade同步操作,也就是当主表的主键字段更新或删除的时候,从表的外键字段也进行相应的更新或删除

    set null设置为null,也就是当主表的主键字段更新或删除的时候,从表的外键字段就设置为null,当前,有一个前提是从表的外键没有非空约束!

    restrict就是拒绝主表更新或删除!

    由于刚才定义外键的时候没有设置级联操作,我们可以先将这个外键删除,然后再增加一个外键

    删除外键

    alter  table  表名  drop  foreign key 外键名;

    注意:

    这里的外键名不是子表的字段名,而是在定义外键的时候由系统自动设定的,我们可以通过数据表的创建语句来查看:'

    show create table studentG

    alter table student drop foreign key student_ibfk_1;

     

    重新添加外键且设置级联操作

    alter  table  表名 add foreign key (子表的字段名) references 父表名(父表的主键) 级联操作

    这里的级联操作可以有两个:

    on update cascade|set null|restrict

    on delete cascade|set null|restrict

    #当主表更新的时候子表同步更新,当主表删除的时候就设置为null

    alter table student add foreign key(stu_tea_id) references teacher(tea_id) on update cascade on delete set null;

     ------- ----------------------------------------------------完结,不足之处请指点啦 ---------------------------------------------------

     

    foreign 

  • 相关阅读:
    P1456 Monkey King
    P3377 【模板】左偏树(可并堆)
    P1074 靶形数独
    P1120 小木棍
    P5490 【模板】扫描线
    糖糖别胡说,我真的不是签到题目
    最长公共子序列
    最长上升子序列
    数的三次方根
    地、颜色、魔法(dfs)
  • 原文地址:https://www.cnblogs.com/zhang19950924/p/13217202.html
Copyright © 2011-2022 走看看