精华内容
下载资源
问答
  • 这篇文章写的很好 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

    数据库主键外键联合主键

    展开全文
  • MySql数据库主键外键与数据库设计

    千次阅读 2019-05-20 01:38:57
    MySql数据库主键外键与数据库设计

    MySql数据库主键外键与数据库设计

    首先要指出的:
    列、字段、属性是一个概念
    行、记录、元组是一个概念

    MySQL数据库CONSTRAINT约束:非空约束,唯一约束,主键约束,外键约束
    show create table table_name\G;可以查看已建表的相关信息,包括主外键,外键名,存储引擎,编码方式等等

    主键约束

    主键:表中经常有一个列或者多列的组合,其值能唯一的标识表中的每一行,这样的一列或多列称为表的主键,通过它可以强制表的实体完整性,当创建或更改标识可以通过定义primary key约束来创建主键,一个表只能有一个primary key约束,而且primary key约束的列不能接受空值,由于primary key约束确保该列数据的唯一性,所以经常用来定义标识列。主键自带索引,并且一个表只能有一个主键约束
        实体完整性这项规则要求每个数据表都必须有主键,而作为主键的所有字段,其属性必须是独一及非空值。

    主键的作用
    用作标识列,区分其他字段
    强制表的实体完整性
    用于其他表的外键关联
    用于记录的修改与删除
    加速查询

    • 创建主键约束
    1. 建表时创建主键
      create table Student(id int primary key,name varchar(32) default null)
    2. 建表后添加主键
      create table Student(id int,name varchar(32));
      alter table Student add primary key(id);
    3. 建表后新加字段并设为主键
      create table Mother(id int,name varchar(32));
      alter tabler Mother add age int primary key;

    删除主键约束
    alter table Student drop primary key;

    联合主键:用两个或两个以上的字段组成的主键,用这个主键包含的字段作为主键约束,这个组合在数据表中是唯一,且加了主键索引。

    创建表时创建联合主键
    create table STUDENT(id int auto_increment,courser int,name varchar(10),primary key(id,courser));

    已有的表添加联合主键
    create table Person(id int,province varchar(8),city varchar(8),country varchar(8));
    alter table Person add constraint main_key primary key(id,province);
    Person是表名,main_key 是联合主键名。在建好的表中我们添加了如下数据:
    在这里插入图片描述

    由于id、province是联合主键,所以我们想要创立
    在这里插入图片描述
    时,会出现如下报错
    在这里插入图片描述
    但是我们可以让一个联合主键的一个字段名一样,另一个字段名不一样来创建,即联合主键的字段名不完全一致:
    在这里插入图片描述

    删除联合主键的主键约束,由于主键约束在表单中的唯一性,我们可以直接删除:
    alter table Person drop primary key;

    外键约束

    为了满足关系型数据库的第三范式,降低数据冗余,在表与表之间需要满足响应的关系,可以为表和表之间设置外键。
    外键约束:用于两个表的数据的数据连接,一个表可以有多个外键,MySQL中的innodb存储引擎支持外键;
    外键对应的是参照完整性,一个表的外键可以是空值,若不为空值,则每一个外键的值必须等于另一个表中的主键的某个值。定义一个外键后,不允许删除另一个表中具有关联关系的行;外键的主要作用是保持数据的一致性、完整性。一个主键表某一字段的和跟他有关联的外键表的某一字段有直接的关联。
    对于有外键关联的两个表来说:
    主表(父表):主键所在的表
    从表(字表):外键所在的表

    mysql设置外键约束字段选取
    父表必须是已经存在或者正在创建的表
    父表主键不能包含空值,但外键可以有
    外键列的数目必须和父表的主键中列的数目相同
    从表外键列和主表主键列对应的列的数据类型相同

    创建表时设置外键约束
    create table friend(id int ,name varchar(20),foreign key(id) references child(id));
    父表child,子表friend

    在已有的表中设置外键约束
    alter table subject add foreign key(id) references child(id);
    注意:子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则创建子表时会出现错误。

    删除外键约束
    有外键约束的列必须先删除外键,然后才能删除该列:
    alter table subject drop foreign key subject_ibfk_1;
    subject_ibfk_1是外键的名字,我们可以自己设,也可以系统生成,这样的话我们要查看建表信息才能知道外键名字是什么。

    查看表中的外键
    show create table table_name
    select * from information_schema.key_column_usage;

    数据库设计

    数据库范式与设计:一对一,一对多,多对多
    关系型数据库的特点:基本组成但对为二维表,各二维表之间存在一定的关系,数据库范式级别越高,数据冗余越低
    第一范式:字段不可再分,只要是个二维表都符合第一范式
    第二范式:每个表都有一个能区分每条记录的主键(非空 唯一 索引)
    第三范式:表中所用数据元素不但能惟一的被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系,只有通过外键来互相联系

    表与表之间的三种关系:
    一对一:如学生分数表与学生信息表,两表有一样的主键ID
    一对多:如教学楼和教室,班级表和学生表的班级ID,多个从表通过外键连接主表主键完成一对多的关系
    多对多:如学生表和课程表,演员和电影;以演员和电影为例,分别建立演员表和课程表,演员表电影表不重复,然后建立一个关系表,将两个表连接起来,变成连个一对多的关系:
    在这里插入图片描述

    建立演员表
    create table actors(id int auto_increment primary key,name varchar(10));
    建立电影表
    create table films(id int auto_increment primary key,name varchar(20));
    建立中间表,并通过外键连接其他相关表
    create table link(id int auto_increment primary key,id_a int,id_f int);
    alter table link add foreign key(id_a) references films(id);
    alter table link add foreign key(id_f) references actors(id);

    这里我们想查询成龙演过的电影:
    select name,f_name from(select * from actors inner join(select id_a,id_f,name as f_name from link inner join films on films.id=link.id_f) as a on a.id_a=id having id=1) as b;

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

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

    2017-03-16 15:56:12
    数据库是主数据库的备份,当主数据库变化时从数据库要更新,这些数据库软件可以设计更新周期。这是提高信息安全的手段。...2,一对多,引用主外键,‘一’相当于主键,‘多’即是引用主键外键。 例如:一
  • 例如: A表中存储了B表的主键为code,那code属性叫做A表的外键索引索引和目录的原理很相似,索引表中关键字可以看作标题,索引中的地址【某一行数据的指针】可以看作对应的页码。 本质上是一种数据结构。 ...
  • 关于数据库主键外键

    2009-07-28 15:59:00
    sql server :varchar类型可以作为主键外键在数据量小的时候,可直接用varchar,在数据量大时候,可用guid作索引用guid的情况,一般为表中无直接的字段可作主键,需要两个以上的字段确定一行。1个guid占16字节,...
  • 主键 外键 索引

    2017-11-30 20:17:05
    主键是一个数据库表中的唯一标识,想必都比较了解。外键索引作为表与表之间的联系枢纽,大家对此褒贬不一,很多人已弃用外键索引,而是在代码层面进行表与表之间的关联。 主键(primary key) 主键能够唯一标识表...
  • MySQL主键 外键 索引

    2017-09-07 17:23:00
    一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是...
  • 一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有...二、主键外键索引的区别 定义: 主键--唯一标识一条记录,不能有重复的,...
  • 数据库主键外键索引理解

    千次阅读 2018-09-14 07:12:18
    表的外键是另一表的主键, 外键可以有重复的, 可以是空值 该字段没有重复值,但可以有一个空值 作用: 用来保证数据完整性 用来和其他表建立联系用的 是提高查询排序的速度 个数: 主键只能有...
  • 对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出...自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样...
  • 主键主键外键索引A “key” is one of the most basic and important concepts of the Database Management System (DBMS); the keys helps us work easily with the records and the tables in our database by ...
  • 一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如  学生表(学号,姓名,性别,班级)  其中每个学生的...
  • 浅谈数据库主键外键索引

    万次阅读 2017-04-08 22:36:19
    定义主键主要是为了维护关系数据库的完整性。 2、外键外键用于与另一张表的关联,是能确定另一张表记录的字段。外键是另一个表的主键,可以重复,可以有多个,也可以是空值。定义外键主要是为了保持数据的一致...
  • 主键主键外键索引 Primary and foreign keys are a way in which to constrain related data together to ensure data in your database remains consistent and to ensure no redundant data is in the database...
  • 定义主键主要是为了维护关系数据库的完整性。   2、外键外键用于与另一张表的关联,是能确定另一张表记录的字段。外键是另一个表的主键,可以重复,可以有多个,也可以是空值。定义外键主要是为了保持数据的...
  • 关于数据库主键外键索引

    千次阅读 2018-06-28 18:18:29
    一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是...
  • 什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,...
  • 先把数据库简单记一下,有两本书还在路上,之后再做补充。 关系型数据库相当于一个二维表,行被称为记录,列被称为字段。 数据类型记录 名称 类型 说明 INT 整型 4字节 ±22亿的范围 BIGINT 长整型 8字节 ...
  • 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,422
精华内容 30,568
关键字:

数据库的主键外键索引