精华内容
下载资源
问答
  • 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时则会有两种意义或起两种作用。

    展开全文
  • MySQL普通索引、唯一索引、主索引、外键索引、复合索引、全文索引的使用
    1.普通索引 
      普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = ...)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
      2.唯一索引
      普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个"员工个人资料"数据表里可能出现两次或更多次。
      如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
      3.主索引
      在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的"主索引"。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。
      4.外键索引
      如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。
      5.复合索引
      索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引。这种索引的特点是MySQL可以有选择地使用一个这样的索引。如果查询操作只需要用到columnA数据列上的一个索引,就可以使用复合索引INDEX(columnA, columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX(A, B, C)可以当做A或(A, B)的索引来使用,但不能当做B、C或(B, C)的索引来使用。
      
      6全文索引
      文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以LIKE %word%的形式出现,这对MySQL来说很复杂,如果需要处理的数据量很大,响应时间就会很长。
      这类场合正是全文索引(full-text index)可以大显身手的地方。在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建,也可以等日后有必要时再使用下面这条命令添加:
      ALTER TABLE tablename ADD FULLTEXT(column1, column2)
      有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法:
      SELECT * FROM tablename
      WHERE MATCH(column1, column2) AGAINST('word1', 'word2', 'word3')
      上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。
      注解:InnoDB数据表不支持全文索引。

      查询和索引的优化
      只有当数据库里已经有了足够多的测试数据时,它的性能测试结果才有实际参考价值。如果在测试数据库里只有几百条数据记录,它们往往在执行完第一条查询命令之后就被全部加载到内存里,这将使后续的查询命令都执行得非常快--不管有没有使用索引。只有当数据库里的记录超过了1000条、数据总量也超过了MySQL服务器上的内存总量时,数据库的性能测试结果才有意义。
      在不确定应该在哪些数据列上创建索引的时候,人们从EXPLAIN SELECT命令那里往往可以获得一些帮助。这其实只是简单地给一条普通的SELECT命令加一个EXPLAIN关键字作为前缀而已。有了这个关键字,MySQL将不是去执行那条SELECT命令,而是去对它进行分析。MySQL将以表格的形式把查询的执行过程和用到的索引(如果有的话)等信息列出来。
      在EXPLAIN命令的输出结果里,第1列是从数据库读取的数据表的名字,它们按被读取的先后顺序排列。type列指定了本数据表与其它数据表之间的关联关系(JOIN)。在各种类型的关联关系当中,效率最高的是system,然后依次是const、eq_ref、ref、range、index和All(All的意思是:对应于上一级数据表里的每一条记录,这个数据表里的所有记录都必须被读取一遍--这种情况往往可以用一索引来避免)。
      possible_keys数据列给出了MySQL在搜索数据记录时可选用的各个索引。key数据列是MySQL实际选用的索引,这个索引按字节计算的长度在key_len数据列里给出。比如说,对于一个INTEGER数据列的索引,这个字节长度将是4。如果用到了复合索引,在key_len数据列里还可以看到MySQL具体使用了它的哪些部分。作为一般规律,key_len数据列里的值越小越好(意思是更快)。
      ref数据列给出了关联关系中另一个数据表里的数据列的名字。row数据列是MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数。row数据列里的所有数字的乘积可以让我们大致了解这个查询需要处理多少组合。
    展开全文
  • 关于MySQL 外键索引

    千次阅读 2017-07-16 00:22:58
    关于MySQL 外键索引的几种情况的分析

    1、什么时候需要用到外键索引呢?

    答:A表中存在唯一索引id_a,B表中的字段包含id_a,由于B表自身已经有主键索引,此时如果将字段id_a设置为外键索引索引(foreign key),则建立外键索引。

    使用场景:

    1)父表更新时,子表也更新;父表删除时,如果

    2)子表有匹配的项,则删除失败。

    (3)父表更新时,子表也更新;父表删除时子表匹配的项也删除。

    即:使用外键可以使得修改或者删除的级联操作的日常维护工作更加轻松。

     

    2、创建语法

    [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name(index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option]

    reference_option:

    RESTRICT | CASCADE | SET NULL | NO ACTION

    (外键值最直接的作用)如果子表试图创建一个父表不存在的外键值,InnoDB会拒绝任何INSERT或者UPDATE操作。

    如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。

    InnoDB支持以下几种动作类型,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RETRICT:

    (1)CASCADE:顾名思义:级联,从父表中删除或者更新对应的行,同时自动的删除或者更新子表中匹配的行。如:ON DELETE CANSCADE和ON UPDATE CANSCADE。(最有用

    (2)SET NULL:从父表中删除或更新对应的行,同时将子表中的外键列设置为空。注意,这些在外键列没有被设为NOT NULL时才生效。如:ON DELETE SET NULL和ON UPDATE SET NULL。

    (3)NO ACTION:

    (4)RESTRICT:拒绝删除或者更新父表。(默认

    举个栗子:

    建立表province:

    CREATE TABLE `province` (

      `id` smallint(6) NOT NULL AUTO_INCREMENT,

      `name` varchar(10) COLLATE utf8_bin NOT NULL,

      PRIMARY KEY (`id`)

    )ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin ;

    建立表student:

    CREATE TABLE `student` (

      `id` smallint(6) NOT NULL AUTO_INCREMENT,

      `name` varchar(10) COLLATE utf8_bin NOT NULL,

      `pid` smallint(6) DEFAULT NULL,

      PRIMARY KEY (`id`),

      KEY `pik_fk` (`pid`),

      CONSTRAINT `pik_fk` FOREIGN KEY (`pid`) REFERENCES `province` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

    )ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    上述student表中已经建立了外键级联索引(包括delete cascade 和 update cascade)

    这里,先介绍下如何删除外键索引:可以看到建立外键索引产生了两个属性一个是字段pid被设置为索引,而且还加了一个约束属性。

    删除的操作:

    (1)dorp table student drop foreign key pik_fk;

    (2)drop table student drop key pik_fk;

    注意:需要分别执行两次pik_fk的操作。

    执行上述操作之后,表结构如下:

    CREATE TABLE `student` (

      `id` smallint(6) NOT NULL AUTO_INCREMENT,

      `name` varchar(10) COLLATE utf8_bin NOT NULL,

      `pid` smallint(6) DEFAULT NULL,

      PRIMARY KEY (`id`)

    )ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    需求一:现在需要增加一个外键索引,当该外键对应的父表删除掉主键id,则对于的该表中关联的字段也要一起删除掉。增加如下:

    alter table student add constraint pid_fk foreign key (pid) references province (id) on delete cascade on update cascade;

    则添加外键索引:

    CREATE TABLE `student` (

      `id` smallint(6) NOT NULL AUTO_INCREMENT,

      `name` varchar(10) COLLATE utf8_bin NOT NULL,

      `pid` smallint(6) DEFAULT NULL,

      PRIMARY KEY (`id`),

      KEY `pid_fk` (`pid`),

      CONSTRAINT `pid_fk` FOREIGN KEY (`pid`) REFERENCES `province` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

    )ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    此时,如果执行删除province中某条记录,则会删除student中所有有关联该条记录主键的记录。如果更新province中主键id,则会更新所有student中原有表对应的外键id。

    需求二:如果删除各province中的主键id,则student中中外键pid将相应更改为null。

    alter table student add constraint pid_fk foreign key (pid) references province (id) on delete set null on update set null;

    需求三:如果province中的主键id在student中外键pid中存在,则不允许进行删除和更改操作。

    alter table student add constraint pid_fk foreign key (pid) references province (id) on delete RESTRICT on update RESTRICT;

    外键索引的缺点:

    由于加了约束,因此操作变慢了。

    展开全文
  • MySQL-外键索引

    2021-08-02 16:16:54
    外键索引 如果数据表含有从属关系,比如部门和员工, 教室和桌椅,班级和同学就可以使用一对多的制表关系 一的一方定义为主表, 多的一方定义为从表 在多的一方添加一列,作为外键约束 ,引用少的一方的主键 如果主...

    一.外键索引

    • 如果数据表含有从属关系,比如部门和员工, 教室和桌椅,班级和同学就可以使用一对多的制表关系
    • 一的一方定义为主表, 多的一方定义为从表
    • 在多的一方添加一列,作为外键约束 ,引用少的一方的主键
    • 如果主表中的主键被应用,则该条数据无法被删除
    • 如果从表中的外键找不到相同值的主键,则无法被插入
    # 创建分类表
    CREATE TABLE category1
    (
        cid   VARCHAR(32) PRIMARY KEY,
        cname VARCHAR(100)#分类名称
    );
    
    # 商品表
    # 外键约束的添加格式
    # 在创建时在最下方添加外键约束:constraint(约束) foreign key(外键字段) reference(参考) 主表(主键)
    CREATE TABLE products
    (
        pid         VARCHAR(32) PRIMARY KEY,
        name        VARCHAR(40),
        price         DOUBLE,
        category_id VARCHAR(32),
        CONSTRAINT FOREIGN KEY (category_id) REFERENCES category1 (cid) # 添加约束
    );
    

    二.注意事项

    • 从表中添加的外键的值,一定要在主表中的id里存在,否则就会报错
    • 如果想要添加从表数据,先添加主表相对应的id的内容
    • 为了保证数据的完整性,如果当前主表中的数据已经被从表引用,则主表中的该数据无法被删除
    展开全文
  • phpadmin添加外键索引

    千次阅读 2017-01-05 11:35:50
    phpadmin 给某个表的某个字段添加外键索引 选中数据库  修改字段的sql语句如下:  ALTER TABLE 表名(主表) ADD FROEIGN KEY (主表中作为外键的字段名) REFERENCES 表2 外键字段在表2中的字段名 表1 student  id ...
  • 简单一句话,默认生成的外键索引没有存在的必要,删除就好了,不然反而会降低新增和更新服务性能 1、数据库初始化时,经常因为pd里配置的外键关系会除了外键之外还会建立上外键索引外键索引是否有存在的必要呢? ...
  • Mysql中的外键索引

    2018-09-10 21:48:18
    外键索引(foreign key) 作用:让当前表的字段值在另一个表的范围内选择。 注意规则: 1.主表的被参考字段和从表的参考字段的数据类型应该相同 2.主表中的参考字段必须是KEY的一种,通常是主键。 mysql&...
  • 主键 外键 索引

    2017-11-30 20:17:05
    外键索引作为表与表之间的联系枢纽,大家对此褒贬不一,很多人已弃用外键索引,而是在代码层面进行表与表之间的关联。 主键(primary key) 主键能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但...
  • I've just created my first mySQL table on my own (other than using Joomla, Wordpress, etc.) and I am MS SQL developer for years but normally I can easily create a foreign key in MS SQL but I came acro...
  • ①参照列没有索引的话,MySQL会自动创建索引,因为参照列含有主键,创建主键时MySQL会默认创建所用; ②外键列的索引也是MySQL根据参照列自动创建的。 转载于:https://my...
  • Oracle 索引监控与外键索引

    千次阅读 2013-03-29 10:49:56
    Oracle 监控索引特性为我们提供了一个大致...其次对于存在子表存在外键的情形,对于主表进行操作时是否会导致索引被监控呢?下面描述的是这个话题。 1、普通监控索引的情形--演示环境 SQL> select * from v$version
  • MYSQL -外键索引

    千次阅读 2019-03-08 20:15:23
    9:59 2019/3/8/周五 ...数据库之间的关联数据库(通过外键来约束) 比如一个表中的key_id和另一个表classcharge的id之间有关联,这个时候应该在里面加入{ foreign key(key_id) references class...
  • 在使用srping data JPA时候,配置了很多类似 一对多的配置,导致在生成数据库在mt_sys_file生成了多个外键约束,最后在保存数据的时候可能出现“违反数据库约束”,例如: ...
  • 主键: 可以唯一标识一条记录的属性组,组代表可以是...索引和目录的原理很相似,索引表中关键字可以看作标题,索引中的地址【某一行数据的指针】可以看作对应的页码。 本质上是一种数据结构。 转载于:https://...
  • 外键索引检查

    2011-04-29 17:49:00
    外键列上缺失索引会带来两个问题: 1.主子表关联查询时,会对子表进行全表扫描 2.主表删除记时,子表会被锁住。 <br />鉴于以上两个原因,我们会选择浪费一些存储空间,在外键上创建索引 ...
  • So when I run my project the User table and the Doc table are created, but I dont see the foreign key for User table in the Doc table.As you can see I have both ManyToOne and OneToMany annotations, an...
  • 外键索引外键索引外键索引! 重要的事情说三遍。 最近在.Net开发中通过Remoting向服务端发送一个请求后,就开始在数据库里通过存储过程来进行大量的DML操作,其中大量数据来源于DBLINK,建立物化视图后...
  • 级别-外键 管理键之间的关系,并流式传输结果。 删除密钥会自动清理它们的关系。 ##Full 使用示例 var level = require ( 'level' ) ; var LevelForeignKeys = require ( 'level-foreignkeys' ) ; var ...
  • mysql主键 外键 索引

    2016-07-03 09:44:04
    http://blog.csdn.net/duck_arrow/article/details/8264686
  • 有时候通过在外键列上建B树索引,可以减小锁定。 1、建测试表 create table student(id number(8) primary key,st_name varchar2(32),class_id number(8)); create table class (class_id number(8) primary key,...
  • 2. 被参照字段不是索引字段添加索引: alter table 表名 add index 索引名;添加外键: alter table 表名 add foreign key 外键名 references 被参照表名(被参照列名)注意: 1. 添加外键语句不需要constraint...
  • 关于外键索引触发器名称重复

    千次阅读 2014-01-24 10:06:38
     外键参照:必须是主键或者候选键,即必须为主键,或者非主键设置索引唯一,且类型一致  索引  普通索引:单表中的名称不可以重复,但是不同表中的索引可以重复,这是因为,其表索引对象,数据库默认前面加上表...
  • 一、什么是主键、外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如  学生表(学号,姓名,性别,班级)  其中每个学生的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,965
精华内容 44,386
关键字:

外键索引