精华内容
下载资源
问答
  • 数据库:主键外键作用
    2019-06-27 17:14:42

    一、什么是主键、外键:
    关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键
    比如
    学生表(学号,姓名,性别,班级)
    其中每个学生的学号是唯一的,学号就是一个主键
    课程表(课程编号,课程名,学分)
    其中课程编号是唯一的,课程编号就是一个主键
    成绩表(学号,课程号,成绩)
    成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以 学号和课程号的属性组是一个主键

    成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键

    同理 成绩表中的课程号是课程表的外键

    定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
    1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。

    身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
    2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。

    比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

    二、 主键、外键和索引的区别

    主键、外键和索引的区别?

    主键

    外键

    索引

    定义:

    唯一标识一条记录,不能有重复的,不允许为空

    表的外键是另一表的主键, 外键可以有重复的, 可以是空值

    该字段没有重复值,但可以有一个空值

    作用:

    用来保证数据完整性

    用来和其他表建立联系用的

    是提高查询排序的速度

    个数:

    主键只能有一个

    一个表可以有多个外键

    一个表可以有多个惟一索引

    聚集索引和非聚集索引的区别?

    聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。

    聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。

    三、数据库中主键和外键的设计原则

    主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。

    必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。

    主键:

    关系数据库依赖于主键—它是数据库物理模式的基石。

    主键在物理层面上只有两个用途:

        1. 惟一地标识一行。
    
        2. 作为一个可以被外键有效引用的对象。
    

    基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:

        1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
    
        2. 主键应该是单列的,以便提高连接和筛选操作的效率。
    
        注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。
    
        3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
    
       注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
    
        4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
    
        5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。
    
    更多相关内容
  • mysql外键作用

    千次阅读 多人点赞 2018-03-23 16:57:03
     外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败。 2.对父表的作用:对父表的主键字段进行删和改时,如果对应的主键在子表...

    mysql中的外键foreign key

    一、如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键。

      一张表中可以有多个外键。

      外键的默认作用有两点:

      1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败。

      2.对父表的作用:对父表的主键字段进行删和改时,如果对应的主键在子表中被引用,操作就会失败。

      外键的定制作用----三种约束模式:

        district:严格模式(默认), 父表不能删除或更新一个被子表引用的记录。

        cascade:级联模式, 父表操作后,子表关联的数据也跟着一起操作。

        set null:置空模式,前提外键字段允许为NLL,  父表操作后,子表对应的字段被置空。

      使用外键的前提:

      1. 表储存引擎必须是innodb,否则创建的外键无约束效果。

      2. 外键的列类型必须与父表的主键类型完全一致。

      3. 外键的名字不能重复。

      4. 已经存在数据的字段被设为外键时,必须保证字段中的数据与父表的主键数据对应起来。

    二、新增外键

      1. 在创建时增加

       create table my_tab1(

       id int primary key auto_increment,

       name varchar(10) not null,

       class int,

       foreign key(class) references my_tab2(主键字段名);

       )charset utf8;

      2. 在创建好的表中增加

       alter table my_tab1 add [constraint 外键名] foreign key(外键字段名) references mytab2(主键字段名);

    三、删除外键

      alter table my_tab drop foreign key 外键名字;

    展开全文
  • 外键作用

    2018-01-11 20:31:32
    1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。 2,有主外键的...
    优点:
    1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
    2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。
    3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。

    缺点:
    1,可以用触发器或应用程序保证数据的完整性
    2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
    3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,    update,    delete    数据的时候更快)
    eg:在海量的数据库中想都不要去想外键,会导致操作数据很慢。

    外键存在的性能问题:
    1.数据库需要维护外键的内部管理;
    2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
    3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
    4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;
    展开全文
  • 浅谈mysql的外键作用

    2021-01-18 21:48:59
    今天主要是要理顺一下mysql中的外键作用。首先理清几个概念:1、在mysql中,只有innodb引擎才有外键功能,myisam没有外键功能。2、本表中的外键是另外一个表的主键3、外键、主键都是表的索引(key,或者index),这点...

    今天主要是要理顺一下mysql中的外键作用。

    首先理清几个概念:

    1、在mysql中,只有innodb引擎才有外键功能,myisam没有外键功能。

    2、本表中的外键是另外一个表的主键

    3、外键、主键都是表的索引(key,或者index),这点很重要,一对一关系就是用外键的唯一索引来做的。

    4、如果A表有一个字段ID(主键),B表有一个映射到A表的外键A_ID字段。那么,我们称B表是从表(子表),A表是主表(父表)。区分这两种表有什么用呢?我们等下所说的一对多关系,一是主表(父表),多是从表(子表),别搞混淆。

    下面我们来看个图。

    98a8dd097726a41a9e418aefa709eefe.png

    2957195.html

    上图student表有一个映射到class ID的外键,因而class跟student是一对多的关系,一个班级可以有N个学生,但一个学生只能有一个班级,从表是student,主表是class。

    好了,在说外键作用之前,我们先搞清楚3个很重要的概念:一对一,一对多,多对多。

    首先是一对一:

    概念:A表中的每一个元素只能对应到B表的一个元素,B表的每一个元素只能对应到A表的一个元素。生活中有很多例子,我就不举例了。

    刚才说了,从表是一对多中的多,那么通过外键能不能建立一对一的关系呢?一开始说了,外键也是个索引,只要我们把外键这个索引设置为“唯一索引(unique)”就可以实现一对一关系了。

    CREATE TABLE `student` (

    `ID` int(10) NOT NULL AUTO_INCREMENT,

    `NAME` varchar(30) DEFAULT NULL,

    `SEX` tinyint(5) DEFAULT NULL,

    `CLASS_ID` int(11) DEFAULT NULL,

    PRIMARY KEY (`ID`),

    UNIQUE KEY `FK_student` (`CLASS_ID`),        //本来是  KEY `FK_student` (`CLASS_ID`),

    CONSTRAINT `FK_student` FOREIGN KEY (`CLASS_ID`) REFERENCES `class` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    583d24214aa172aefb44d7f43cd2d795.png

    2957195.html

    现在就是一对一关系了,一个班只有一个学生,一个学生只上一个班。

    注意了:哪怕是一对一关系,但两个表不是平等地位的!一样有主表从表,有父表子表。

    一对多(习惯叫一对多,不叫多对一):

    一对多关系我觉得是最常用的。

    概念:A表中的每一个元素在B表中可以找到多个元素与之对应,但是,在B表中的每一个元素只能在A表中找到唯一一个元素与之对应。

    好像,每一个班级都能找到N个学生与之对应,但是,每个学生却只能找到一个班与之对应。

    18685a49598fa6dbb497f35af8117203.png

    刚才也说了,外键不是唯一索引都可以构成一对多关系,主表是一,从表是多。

    多对多

    这个关系稍复杂了点,但也是很常用的。

    概念:A表中的每一个元素在B表中可以找到多个元素与之对应,同样,在A表中的每一个元素也能在B表中找到N元素与之对应。

    举个例子:一群朋友去吃饭,饭桌上N个菜,每个菜都可以让你们所有人吃。同样,你们每个人也可以吃所有的菜。(哈,这例子似乎不咋地)

    通过外键,我们可以容易建立一对多关系,把外键设成唯一索引可以建立一对一关系。那么多对多关系怎样建立呢?这里要复杂一点,要建立三个表,其中有一个是中间表。

    我们改一改上面的情境,class是兴趣班,一个学生可以参加多个兴趣班,一个兴趣班也有多个学生。

    f85f80aa722bb4c71c555db41f03de48.png

    2957195.html

    看到没有,我们建立了一个中间表student_class,里面放什么东西?没错,放映射到student ID和映射到class ID的外键,不干别的,为了促成多对多关系,它放外键就可以了。

    现在就是两个主表,一个公共从表了。

    =================================================================================================

    好了,现在得说外键的作用了。

    有没有发现,就算没有建立外键,我就建立几个表,一对一、一对多建立两个表,多对多建立三个表,然后字段不变,然后把一些XXX_ID字段设为索引,表之间的逻辑连线只在我们的脑海里,实际上表间是没什么联系的。这样,是不是也能完成我们的CRUD操作?

    答案是可以的!为什么不可以啊?如果没有外键就不能建立表间的逻辑关系,你叫myisam这引擎怎么混啊?毕竟,这些表间的联系都是咱们数据库设计者脑海中的逻辑。

    举个例子:

    81491c57ee8ddd39e9ad53575bc12340.png

    2957195.html

    这两个表除了没有外键,跟上面的一样。我们来实现以下CRUD。

    R(我们要查询student表,要把class_id转换成class_name):so easy是吧?你用嵌套查询也行,join也行,一下子就能实现关联查询了。

    C(我们要创建一个新的班,然后又建立一个新的学生,让这个学生加入这个班):也不难,我们create一个新的班,然后得到一个insert id,然后就create

    学生,把刚才的insert id填充到class_id。

    U(我们要修改一下class表的NAME,student表也能更新):so easy,我们查询student表的时候时候是用join的,所以只要student中的class_id还在,我们都

    能把class表对应的数据查出来。

    D(我们要把一个班删掉,而且要把stundet中选了这个班的学生的CLASS_ID设置为null):这个似乎又点难度,不过我们分两步来:我们首先是得到一个class表的id值,我们先把class表中的id对应的班级删掉,然后在student中update,where条件是CLASS_ID = id。OK,分两步可是可以完成任务。

    =================================================================================================

    CRUD似乎都能不靠外键也能完成。那么外键有什么用呢?我只能说,上面种种的操作其实是很啰嗦的,使用外键可以很便捷的完成。

    我们来重新审视一下上面的CRUD。

    R:怎么弄也就是关联查询的了,这有没外键应该关系不大,不过有了外键可以比较明确我要join那个,也就是明确点而已,没什么实际上的机制帮助。

    C:我们应该多考虑一种情况,我们在创建或者修改student表中的CLASS_ID的时候,会不会出现那个CLASS_ID实际上是不存在?也就是说,在class表中是没有这个ID。这情况会不会存在?哈,那是肯定会存在的。而且很容易发生。如果像刚才,这个情况完全没得检测,只好等查询的时候,哦,查不出班级名称了,再去检查,尼玛,原来CLASS_ID不存在!多蹩脚!现在我们建立了外键,如果想插入一个不存在的CLASS_ID,那是会检测出来,报错。这就叫外键约束,也叫完整性约束。

    U:上面我们只是修改CLASS表的NAME,那就好办,改了就改了,下次一样通过关联查询查出来。但是,如果我现在的要求是改CLASS表的ID呢?你怎么办?也分两步,一个表改完到另外一个表?卧槽,太麻烦了。外键可以帮到你。有一种完美的结果:在CLASS改完ID后,student中的class_ID跟着改变。就是以前是分两步的,现在一步搞掂!这叫外键的级联操作!含义是操作一次,实现两步。

    鸡冻啊,那究竟怎样实现(SQLyog为例)呢?很简单,在设置外键的时候,有以下这么一栏:

    2957195.html

    833146e62993dc01d759d65d28c6d3f5.png

    这里解释以下这四个radio是神马意思:

    层叠:就是上面所有的级联,我最喜欢了,修改了主表(从表外键映射过来的对应字段),注意是主表,从表也会做出相应动作。例如,CLASS_ID更新。

    设为Null:就是一旦变动了,student中的CLASS_ID变为null,这个功能在update中应用不大。

    无动作(默认):这个就是主表变动了(从表外键映射过来的对应字段),从表不干活,还是保持原来那样。这样的话,外键是作用为0。

    约束:这个霸气一点,就是由于主从表示有关联的,所以不允许你主表改变(从表外键映射过来的对应字段)。

    我们要实现上面的级联操作,同时更新,要选哪个啊?果断选层叠啊!注意了,推荐在update中的时候选层叠。

    现在我们看看sql语句是怎样的。

    f6bc99034df3c57af949b9cabda3a88a.png

    看到没有,第二行:ON UPDATE CASCADE,on表示触发,就是主表更新(从表外键映射过来的字段)的时候,触发级联事件CASCADE。

    D:好了,在说U的时候已经把外键的功能说了一大半了,现在举一反三,要实现上面的删除主表记录,从表的CLASS_ID设为null,也是可以使用外键把两步缩成一步,又是级联操作。

    我们该怎么设置?没错,外键选项在删除时设为null就可以了。

    f871e9149303296517eaab596a6bd2a8.png

    2957195.html

    有时候是需要主表删除了,对应的从表也要删除,这就要选择层叠了。

    呼,写了那么多,好像十分冗杂。现在来总结一下:

    1、外键的建立让我们操作数据库更加便捷(当然,这肯定要牺牲效率为前提的)。主要功能有两个:完整性约束(C的例子),级联操作(U,D例子),子表同时变动,依靠事件触发机制。

    2、下面做了一个表,直观点看看完整性约束和级联操作的触发情况。

    2957195.html

    fd6e2785941a8f32a3e806070e82a9d1.png

    注意:打钩的表示最简易操作,C的时候可以随便你怎样在主表插入数据,不影响从表。U,D的时候怎样操作从表也行,不影响主表。

    其实也不用记这个表,就记住一点:外键的建立让我们的多个数据表没有“脏”数据。每条记录都是关联的!

    一句话:外键是帮助使用者的一个机制,如果没有外键,约束性和级联操作只能靠使用者较强的逻辑能力了,呵呵,逻辑不强踩了炸弹也不知道。

    展开全文
  • 1.外键作用: 使两张表形成关联,外键只能引用外表中的指定列的值! 2.建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表的主键)。 3.事件触发限制: on delete(删除)和on update (更新),  ...
  • sqlite3 外键作用原理和使用方法

    千次阅读 2017-03-26 22:27:05
    1. sqlite3 默认为关闭外键限制的,如要打开,请执行如下命令:PRAGMA FOREIGN_KEYS=ON; sqlite3 外键的创建和使用方法一: 例如,我们创建如下两个表,Persons 和 Orders。 create table persons
  • MySQL外键作用:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值!我们来建两个表CREATETABLE`example1`(`stu_id`int(11)NOTNULLDEFAULT'0',`course_id...
  • Mysql外键作用和用法

    千次阅读 2020-12-04 17:24:55
    个人理解,有误请指出。 章节目录语法约束概念示例设置为RESTRICT设置为CASCADE设置为SET NULL注意事项创建外键删除外键 ...约束:在语法添加,约束名不同,作用不同,下面单独说。 约束 概念 navicat
  • MySQL中外键的介绍:MySQL外键必须使用存储引擎为 innDB 其中MySAM 和MEMORYH这两种引擎不支持由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机...
  • 数据库——外键作用

    千次阅读 2019-08-15 12:47:02
    我们用一个比较实际的例子来描述问题,并讲解外键作用: 当我们在网上购物的时候,我们有我们的帐号,还有我们所在不同地方的地址信息如公司,学校,家里,或者给亲戚朋友送个礼物,收货人信息也不一样。 我们...
  • Mysql范式及外键作用

    2022-01-29 09:53:20
    但是拆分出来的表与表之间是有着关联关系的,我们必须得通过一种约束来约定表与表之间的关系,这种约束就是外键约束 外键约束的作用 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是...
  • 1.外键作用,主要有两个:一个是让数据库自己通过外键来保证数据的完整性和一致性一个就是能够增加ER图的可读性2.外键的配置1)先创建一个主表,代码如下:#创建表student,并添加各种约束create table student(id int...
  • QL的主键和外键作用外键取值规则:空值或参照的主键值。(1)插入非空值时,如果主键表中没有这个值,则不能插入。(2)更新时,不能改为主键表中没有的值。(3)删除主键表记录时,你可以在建外键时选定外键记录一起...
  • MySQL02: DML语言 原文链接:公众号狂神说 视频教程:狂神说Java 外键 外键概念 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。...外键作用 保持数据一致性,完
  • 什么是外键外键作用

    千次阅读 2021-01-05 13:48:13
    外键作用: ①为了一张表记录的数据不要太过冗余。 ②保持数据的一致性、完整性。 是否有必要使用外键? 正方(需要) 1.数据一致性 由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据 ...
  • 定义主键和外键主要是为了维护关系数据库的完整性,总结一下:1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。...索引的作用:索引的作用相当于图书的目录,可以根据目录...
  • 外键作用:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!例如:a b 两个表a表中存有 客户号,客户名称b表中存有 每个客户的订单有了外键后你...
  • mysql建立外键

    2021-01-20 00:11:20
    外键作用: 使两张表形成关联,外键只能引用外表中的列的值! 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制: on delete和on update , 可设...
  • 外键约束的作用,是保证字表某个字段取值全都与另一个数据表主键字段相对应。也是说,只要外键约束存在并有效,不允许无参照取值出现在字表列中。具体在Oracle数据库中,外键约束还是存在一些操作选项的。本篇主要从...
  • 本文摘自参考三篇文章,从这篇文章中将了解到外键作用以及navicat建立外键常见错误解决,帮助读者更加深刻了解外键。 文章目录外键的作用不设置外键行不行?那到底使不使用外键? 外键的作用 外键用于与另一张表...
  • 分享给大家供大家参考,具体如下:本文内容:什么是外键外键的增加外键的修改和删除外键的约束模式首发日期:2018-04-12什么是外键外键就是表中存在一个字段指向另外一个表的主键,那么这个字段就可以称为外键。...
  • 详解MySQL 外键约束

    2020-12-14 08:20:16
    1.外键作用: MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。 2.外键的使用条件 两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持) 外键列必须建立了...
  • 外键作用: 1.实体完整性,确保每个实体是唯一的(通过主键来实施) 2.域完整性,确保属性值只从一套可选的集合里选择 3.关联完整性,确保每个外键或null或含有与相关主键值相配的值 foreign key 约束的主要目的是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,672
精华内容 33,068
关键字:

外键的作用