精华内容
下载资源
问答
  • 这篇文章写的很好 https://blog.csdn.net/bingqingsuimeng/article/details/51595560
    展开全文
  • title: 数据库主键外键索引 date: 2018-04-08 16:03:01 uodated: 2020-03-07 14:05:24 categories: 数据库 tags: - 数据库 这是一篇数据库的主键、外键、索引的学习笔记 数据库主键外键索引 主键、外键和索引...

    title: 数据库的主键外键索引
    date: 2018-04-08 16:03:01
    uodated: 2020-03-07 14:05:24
    categories: 数据库
    tags:
    - 数据库


    这是一篇数据库的主键、外键、索引的学习笔记

    数据库的主键外键索引

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

    主键 外键 索引
    定义 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值
    作用 用来保证数据完整性 用来和其他表建立联系用的
    个数 主键只能有一个 一个表可以有多个外键

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

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

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

    mysql中key 、primary key 、unique key 与index区别

    来源:mysql中key 、primary key 、unique key 与index区别 + mysql中key 、primary key 、unique key 与index区别 + MySQL 索引-菜鸟教程

    • key的用途:主要是用来加快查询速度的。

    • unique Key是唯一键,而Primary key是主键
      Primary key 与Unique Key都是唯一性约束。但二者有很大的区别:

      1、Primary key的1个或多个列 必须为NOT NULL,如果列为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。而UNIQUE KEY 对列没有此要求。

      2、一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY。

    • MySQL 中Index 与Key 的区别:

      key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)

      index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等;
      因此,索引只是索引,它不会去约束索引的字段的行为(那是key要做的事情)。如,create table t(id int, index inx_tx_id (id));

      请详看key和index区别

      Key即键值,是关系模型理论中的一部份,比如有主键(Primary Key),外键(Foreign Key)等,用于数据完整性检否与唯一性约束等。

      而Index则处于实现层面,比如可以对表的任意列建立索引,那么当建立索引的列处于SQL语句中的Where条件中时,就可以得到快速的数据定位,从而快速检索。

      至于Unique Index,则只是属于Index中的一种而已,建立了Unique Index表示此列数据不可重复,猜想MySQL对Unique Index类型的索引可以做进一步特殊优化吧。

      于是乎,在设计表的时候,Key只是要处于模型层面的,而当需要进行查询优化,则对相关列建立索引即可。

      另外,在MySQL中,对于一个Primary Key的列,MySQL已经自动对其建立了Unique Index,无需重复再在上面建立索引了。

      总结: (1).我们说索引分类,分为主键索引、唯一索引、普通索引(这才是纯粹的index)等,也是基于是不是把index看作了key。
      比如 create table t(id int, unique index inx_tx_id (id)); --index当作了key使用

      (2).最重要的也就是,不管如何描述,理解index是纯粹的index,还是被当作key,当作key时则会有两种意义或起两种作用。

    展开全文
  • 数据库主键外键联合主键 主键类型 所有数据库表必须具有一个主键列。 主键唯一地标识表中的一行,因此它受到以下约束的约束: 独特 非空 不可变的 选择主键时,我们必须考虑以下方面: 主键可用于通过...

    数据库主键外键联合主键

    主键类型

    所有数据库表必须具有一个主键列。 主键唯一地标识表中的一行,因此它受到以下约束的约束:

    • 独特
    • 非空
    • 不可变的

    选择主键时,我们必须考虑以下方面:

    • 主键可用于通过外键关系连接其他表
    • 主键通常具有关联的默认索引,因此数据类型越紧凑,索引将占用的空间越少
    • 一个简单的键比复合键的性能更好
    • 即使在高度并发的环境中,主键分配也必须确保唯一性

    选择主键生成器策略时,选项为:

    1. 自然键,使用保证单个行唯一性的列组合
    2. 替代键,独立于当前行数据生成

    自然键

    自然密钥的唯一性受外部因素(例如,人的唯一标识符,社会保险号,车辆识别号)的影响。

    自然键很方便,因为它们具有与外界等效的功能,并且不需要任何额外的数据库处理。 因此,即使在将实际行插入数据库之前,我们也可以知道主键,从而简化了批处理插入。

    如果自然键是单个数字值,则性能可与替代键的性能相媲美。

    对于复合键,我们必须意识到可能的性能损失:

    • 复合键联接比单键联接慢
    • 复合键索引比单键索引需要更多空间

    对于索引和连接,非数字键的效率低于数字键(整数,bigint)。 CHAR(17)自然密钥(例如,车辆识别号)占用17个字节,而不是4个字节(32位整数)或8个字节(64位bigint)。

    最初的模式设计唯一性假设可能不会永远成立。 假设我们使用了一个特定的国家/地区公民数字代码来标识所有应用程序用户。 如果现在我们需要支持其他没有此类公民数字代码或与现有条目冲突的国家,那么我们可以得出结论,架构的发展可能受到阻碍。

    如果自然键唯一性约束发生变化,将很难同时更新主键(如果我们仍然设法删除了主键约束)和所有关联的外键关系。

    代理键

    代理键是独立于当前行数据而生成的,因此其他列约束可以根据应用程序业务需求自由发展。

    数据库系统可以管理代理密钥的生成,并且密钥通常是数字类型(例如,整数或bigint),每当需要新密钥时就递增。

    如果我们想控制代理密钥的生成,我们可以使用128位GUIDUUID 由于不再需要额外的数据库密钥生成处理,因此简化了批处理并可以提高插入性能。 即使未广泛采用此策略,在设计数据库模型时也值得考虑

    当数据库标识符生成责任落在数据库系统上时,有几种策略可以自动增加代理键:

    数据库引擎 自动递增策略
    Oracle 序列
    微软SQL 身份 顺序
    PostgreSQL 序列串行类型
    MySQL 自动递增
    DB2 身份 顺序
    数据库 身份 顺序

    设计方面

    翻译自: https://www.javacodegeeks.com/2014/06/database-primary-key-flavors.html

    数据库主键外键联合主键

    展开全文
  • 数据库主键外键总结

    2019-09-26 20:36:32
    主键外键索引的区别 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键,外键可以有重复的,可以是空值 该字段没有...

    一.主键、外键和索引的区别

     

    主键

    外键

    索引

    定义:

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

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

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

    作用:

    用来保证数据完整性

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

    是提高查询排序的速度

    个数:

    主键只能有一个

    一个表可以有多个外键

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

     

     

    二.聚集索引和非聚集索引的区别

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

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

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

    主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。

    主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。

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

    主键:

      关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途

            1. 惟一地标识一行。

            2. 作为一个可以被外键有效引用的对象。

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

            1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。

            2. 主键应该是单列的,以便提高连接和筛选操作的效率。

           注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。

      涉及业务相关的字段,绝对不允许作为物理primary key。其害处很多:
      (1)、如果有频繁的业务修改,其相应主键字段有修改的可能。会导致非聚集索引中的主键信息相应修改(假如主键默认为聚集索引),而且容易造成表中记录的物理移动。
      (2)、可能导致业务信息外泄。
      (3)、生成有业务含义的字段需要按照一定的规则生成,不可避免使用varchar等字符串类型,影响插入和查询效率。
      (4)、业务规则发生变化,造成的影响容易扩大。

            3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。

           注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。

            4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。

            5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。

     

    四、数据库主键选取策略

    存在就有道理,各有优缺点,但是世界需要偏执狂去势不可挡地做成事。

    另一方面,兼容并蓄,泛观博取,了解各种事物的好处和坏处是一种智慧。

    我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。

    常见的数据库主键选取方式有:

    • 自动增长字段
    • 手动增长字段
    • UniqueIdentifier
    • “COMB(Combine)”类型

    1.自动增长型字段

    很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。

    尽管自动增长型字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有两张表:

    Order(OrderID, OrderDate) OrderDetial(OrderID, LineNum, ProductID, Price)

    Order表中的OrderID是自动增长型的字段。现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生:

    首先,为了能在OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个OrderID填充OrderDetail表。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务保护下同时进行,即确保两表同时更行成功。显然它们是相互矛盾的

    除此之外,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?

    2手动增长型字段

    既然自动增长型字段会带来如此的麻烦,我们不妨考虑使用手动增长型的字段,也就是说主键的值需要自己维护,通常情况下需要建立一张单独的表存储当前主键键值。还用上面的例子来说,这次我们新建一张表叫IntKey,包含两个字段,KeyName以及KeyValue。就像一个HashTable,给一个KeyName,就可以知道目前的KeyValue是什么,然后手工实现键值数据递增。在SQL Server中可以编写这样一个存储过程,让取键值的过程自动进行。代码如下:

     

    CREATE PROCEDURE [GetKey] @KeyName char(10),  @KeyValue int OUTPUT  AS UPDATE IntKey SET @KeyValue = KeyValue = KeyValue + 1 WHERE KeyName = @KeyName GO

    这样,通过调用存储过程,我们可以获得最新键值,确保不会出现重复。若将OrderID字段设置为手动增长型字段,我们的程序可以由以下几步来实现:首先调用存储过程,获得一个OrderID,然后使用这个OrderID填充Order表与OrderDetail表,最后在事务保护下对两表进行更新。

    使用手动增长型字段作为主键在进行数据库间数据复制时,可以确保数据合并过程中不会出现键值冲突,只要我们为不同的数据库分配不同的主键取值段就行了。但是,使用手动增长型字段会增加网络的RoundTrip,我们必须通过增加一次数据库访问来获取当前主键键值,这会增加网络和数据库的负载,当处于一个低速或断开的网络环境中时,这种做法会有很大的弊端。同时,手工维护主键还要考虑并发冲突等种种因素,这更会增加系统的复杂程度。

    3使用UniqueIdentifier

    SQL Server为我们提供了UniqueIdentifier数据类型,并提供了一个生成函数NEWID( ),使用NEWID( )可以生成一个唯一的UniqueIdentifier。UniqueIdentifier在数据库中占用16个字节,出现重复的概率非常小,以至于可以认为是0。我们经常从注册表中看到类似

    {45F0EB02-0727-4F2E-AAB5-E8AEDEE0CEC5}

    的东西实际上就是一个UniqueIdentifier,Windows用它来做COM组件以及接口的标识,防止出现重复。在.NET里管UniqueIdentifier称之为GUID(Global Unique Identifier)。在C#中可以使用如下命令生成一个GUID:

     

    Guid u = System.Guid.NewGuid();

    对于上面提到的Order与OrderDetail的程序,如果选用UniqueIdentifier作为主键的话,我们完全可以避免上面提到的增加网络RoundTrip的问题。通过程序直接生成GUID填充主键,不用考虑是否会出现重复。

    UniqueIdentifier字段也存在严重的缺陷:首先,它的长度是16字节,是整数的4倍长,会占用大量存储空间。更为严重的是,UniqueIdentifier的生成毫无规律可言,要想在上面建立索引(绝大多数数据库在主键上都有索引)是一个非常耗时的操作。有人做过实验,插入同样的数据量,使用UniqueIdentifier型数据做主键要比使用Integer型数据慢,所以,出于效率考虑,尽可能避免使用UniqueIdentifier型数据库作为主键键值。

    4使用“COMB(Combine)”类型

    既然上面三种主键类型选取策略都存在各自的缺点,那么到底有没有好的办法加以解决呢?答案是肯定的。通过使用COMB类型(数据库中没有COMB类型,它是Jimmy Nilsson在他的“The Cost of GUIDs as Primary Keys”一文中设计出来的),可以在三者之间找到一个很好的平衡点。

    COMB数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么我们能不能通过组合的方式,保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。也许有人会担心UniqueIdentifier减少到10字节会造成数据出现重复,其实不用担心,后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!

    五.关于外键

    外键是一种约束,数据库需要检查约束,坏处是这可能挺浪费时间,好处是是数据库安全性有所提高。

    外键的坏处:

      1.程序逻辑,完整性,我会在存储过程或包等地方做严谨的判断;

      2.性能问题,这是我最不喜欢用的关键原因,比如一个业务流水表,频繁插入数据,如果这个表身上有3外键,那么每次插入一条,就必须对这3个外键对应的3个表做相应的查找判断有无对应数据,如果这3个表也很大,那就这3个表的判断时间就很常,虽然外键指向的关联表的字段肯定是索引,但是我觉得很多时候,这样的判断本来就在程序里控制好了,通过外键再判断一次,就是降低性能;而且其实有的地方判不判断也无所谓的,但是用了外键,就必须化时间去判断,无论oracle内部多么优化外键对于数据的检索速度,它总是一个不小的消耗;
      3.维护麻烦,很多公司的软件都是定制的,这种定制的东西,随意性相对较大,项目开发实施过程中,需要经常对表修修补补;还有就是业务逻辑有bug或者其他情况,需要经常手工维护数据,有错综复杂的外键关联着,很是麻烦;
      4.外键定死了两个表之间数据的先后生成关系,最常见的是单据主从表,有的时候,在生成单据的时候,是先生成明细,再生成主表;如果钉死了外键,这个就没法实现。

    外键的好处也是大大的,要不然那些设计数据库的人们干啥费劲吧哈的整这个。

    结论是:该有时就有,想有时就有。

    listen to your heart

    转载于:https://www.cnblogs.com/weiyinfu/p/5291654.html

    展开全文
  • 例如: A表中存储了B表的主键为code,那code属性叫做A表的外键索引索引和目录的原理很相似,索引表中关键字可以看作标题,索引中的地址【某一行数据的指针】可以看作对应的页码。 本质上是一种数据结构。 ...
  • 主键 外键 索引

    2017-11-30 20:17:05
    主键是一个数据库表中的唯一标识,想必都比较了解。外键索引作为表与表之间的联系枢纽,大家对此褒贬不一,很多人已弃用外键索引,而是在代码层面进行表与表之间的关联。 主键(primary key) 主键能够唯一标识表...
  • 一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有...二、主键外键索引的区别 定义: 主键--唯一标识一条记录,不能有重复的,...
  • 主键外键索引说明

    2017-12-13 10:00:00
    一、什么是主键外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的...
  • MySQL 主键 外键 索引

    2018-06-18 20:36:52
    主键: 主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id int...
  • MySQL主键 外键 索引

    2017-09-07 17:23:00
    一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是...
  • 数据库主键外键索引理解

    千次阅读 2018-09-14 07:12:18
    表的外键是另一表的主键, 外键可以有重复的, 可以是空值 该字段没有重复值,但可以有一个空值 作用: 用来保证数据完整性 用来和其他表建立联系用的 是提高查询排序的速度 个数: 主键只能有...
  • 如何保证缓存与数据库的一致性 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 缓存 + 数据库 必须保持一致性的话,最好不要做这个方案。即:读请求和写请求串行化...
  • 对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出...自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样...
  • 一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如  学生表(学号,姓名,性别,班级)  其中每个学生的...
  • 定义主键主要是为了维护关系数据库的完整性。   2、外键外键用于与另一张表的关联,是能确定另一张表记录的字段。外键是另一个表的主键,可以重复,可以有多个,也可以是空值。定义外键主要是为了保持数据的...
  • 什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,...
  • 先把数据库简单记一下,有两本书还在路上,之后再做补充。 关系型数据库相当于一个二维表,行被称为记录,列被称为字段。 数据类型记录 名称 类型 说明 INT 整型 4字节 ±22亿的范围 BIGINT 长整型 8字节 ...
  • 关于数据库主键外键索引

    千次阅读 2018-06-28 18:18:29
    一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是...
  • 浅谈数据库主键外键索引

    万次阅读 2017-04-08 22:36:19
    定义主键主要是为了维护关系数据库的完整性。 2、外键外键用于与另一张表的关联,是能确定另一张表记录的字段。外键是另一个表的主键,可以重复,可以有多个,也可以是空值。定义外键主要是为了保持数据的一致...
  • 主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id int(10) not...
  • 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 ...
  • 二、 主键外键索引的区别  主键外键索引的区别?   主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,648
精华内容 659
关键字:

数据库主键外键索引