zoukankan      html  css  js  c++  java
  • 数据库中的外键

    转自(简简单单说外键和级联

    • 外键
      • 定义
      • 作用
      • 主表和从表
      • 建键原则
      • 事件触发限制
    • 外键简单实例
    • 触发器实现
      • 建表语句
      • 关系说明
      • 实现级联删除
    • 更改设置实现
    • 总结

    文首

            今天给考试系统添加学生信息失败,原因是student与classes表有级联关系,作为从表的student表不能随意添加,这些都学过却还没怎么用过,借这次机会学习一下。

    外键

             说到级联删除不得不先说一下外键,外键的定义:“如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键;换而言之,如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键则该属性集是关系模式R的外键”。 

            建立外键的sql语句:

    1. foreign key(idB) references A(idA)  

            从语法分析也可以看出:外键是一种表之间字段值的引用关系

            主表和从表

            主表和从表:以另一个关系的外键作主关键字的表被称为从表,具有此外键的表被称为主表。说白了就是:主表是被引用的表,外表是引用其他表的表

            那么外键有什么作用?外键作用可以说是:保持数据一致性,完整性,关联性,主要目的是控制存储在外键表中的数据。就是当你对一个表的数据进行操作,和他有关联的一个或更多表的数据能够同时发生改变,避免无效或是无用的改变和孤立的数据

            建键原则

           1、 外键字段为主键
      2、 所有的键都必须唯一
      3、避免使用复合键
      4、外键总是关联唯一的键字段

            外键约束事件触发。既然有外键约束,当违反约束时会发生什么?我们把它的反应看作事件,一共有四种:

            1、级联:当主表更改时,从表跟从更改。

            2、不执行任何操作。

            3、设置null。

            4、设置默认值。

             我的看法

             这些听着挺玄,我说说自己的看法:主 表、从表和外键的定义:我把我的笔记本借给你用,可以把“我”当作是主表、“笔记本”当作外键、“你”当作从表,就是说“你”在使用(引用)“我”的“笔 记本”;外键的作用就是:现在你想把我的笔记本卖了扔了送人(增加更新删除等),得看看我允许不允许,我想搬家走人,你不把笔记本还给我,我不能搬;建键 原则:借之前首先咱得说好了,我只有这么一台笔记本,你也最好是也只借了我这台笔记本,避免你也借了别人的笔记本,不知道哪个是我的了。事件触发:我说你 赶紧把笔记本还给我,你可以选择还给我,可以选择不搭理我等。总而言之,由于这笔记本,“你”和“我”关联起来,这台笔记本怎么样,不能一个人说了算。

    简单实例

            说了这么多,咱先说个简单的实例:建立两个表t_main和t_branch,并设置外键。语句的意思是t_main中的id是t_branch 的外键。

    1. create table t_main  
    2. (  
    3.      id int primary key,  
    4.      [content] varchar(100) not null  
    5.       
    6. )  
    7. create table t_branch  
    8. (  
    9.     mainId int Primary key ,  
    10.     [content] varchar(100) not null,  
    11.     foreign key(mainId) references t_main(id)  
    12. )  

            执行语句,现在我想直接在t_branch中插入一条数据insert into t_branch values(3,'分支表'),提示如下:INSERT 语句与 FOREIGN KEY 约束"FK__t_branch__mainId__4F7CD00D"冲突。该冲突发生于数据库"beidaqingniao", 表"dbo.t_main", column 'id'。

           我想删除t_main语句drop table t_main,提示如下:无法删除对象 't_main',因为该对象正由一个 FOREIGN KEY 约束引用。

            在这两个表中,该外键的作用是,t_main中没有的外键值t_branch不能插入,而t_branch 正在引用t_main所以也不能只先删除t_main,否则t_branch中的数据会被孤立。我觉得,外键对主表的作用更倾向于不能删除,而对从表的作 用更倾向于不能随便添加。

    级联删除

           但是如果想级联删除怎么办?总结出三种办法。

           sql语句修改设置:因为默认的外键触发是“不执行任何操作”,所以我们可以使用sql语句更改设置:

    1. FOREIGN KEY(id)REFERENCES tabley(id) on delete cascade on update cascade   

            意思是从表会跟随主表的改变而改变。

           可视化修改:不想写代码,也可以可视化操作,新建数据库关系图,选择主表和从表添加,其关系也会自动添加。选择主表或从表---右键---关系---insert和update规范---级联。如图:

            当然也可以使用触发器,触发器的基础知识,欢迎访问我的博客《详解sql中的触发器

    1. -- =============================================  
    2. -- Author:      李达    
    3. -- Create date: 2012年6月10日 18:11:46  
    4. -- Description: 简单的级联删除  
    5. -- =============================================  
    6. ALTER TRIGGER [dbo].[trigCascadeDelete]    --触发器名  
    7.    ON  [dbo].[main]      ---作用于哪张表  
    8.    instead of  delete    ---什么动作触发  
    9. AS   
    10. BEGIN  
    11.     declare @id int   --声明@id变量  
    12.     select @id=id from deleted --取出要删除的id  
    13.     delete from branch where mainId =@id  --先删除从表中的数据行  
    14.     delete from main where id =@id   ---再删除主表中的数据行  
    15. END  

    总结

            看过的知识不是你的,学过的知识不一定是你的,只有总结、运用后,才能更好的掌握知识,眼高手低的结果就是纸上谈兵。

    转自(数据库 外键

    外键是什么?

        外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。

        外键数据库一级的完整性约束,由数据库自行维护.你也可以手动建立.

        1如果存在外键关系的话,任何修改主表主键字段和删除主表行的行为,都是不可执行的.

        2如果存在外键,,那么有外键的表的字段,会随着主表的更新而更新.

        3.可以使用级联删除.

    你建了两张表
    Student_info和Student_numeric
    学生信息表和学生成绩表
    现在说如果有个学生不读书 了 我们就肯定要在学生信息表里删除这个学生的信息,在学生信息表里面,包括他的 ID , Name , Adderss 等的信息,就是说在学生信息表里面删除这个学生,那么在学生成绩表里面呢,这个学生不存在了,在学生成绩表里面还有这个学生的成绩,肯定是不行的,肯定要 级联的删除了,这里就要用到级联删除了,否则就说不过去了

        4.如果一个字段是外键的话,他必须来自于主表中的某一条数据,否则的话他必须为空.

        从而防止错误数据的录入.

      如果你不希望使用外键,你可以随时删除外键.

  • 相关阅读:
    总账数据访问安全性控制(5)
    XML输出中文时,无法用xsl查看(XML文件不能正常显示、中文显示乱码)
    设计抗混叠滤波器的三大指导原则(转载)
    Verilog中变量位宽注意
    学习cordic算法所得(流水线结构、Verilog标准)
    傅里叶分析的理解
    转载:Allegro实用技巧之模块复用
    c语言学习之 辗转相除法求最大公约数
    c语言学习之 正序分解整数
    新博客开张
  • 原文地址:https://www.cnblogs.com/usa007lhy/p/3415135.html
Copyright © 2011-2022 走看看