精华内容
下载资源
问答
  • 关于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;

    外键索引的缺点:

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

    展开全文
  • 索引的意义就不说了,参考其他资料,总之就是大大加快查询,删除,更新的速度。牺牲了小部分物理空间,毕竟索引也是要存的。(B+树原理) 所以设计索引的时候尽量做到区分度好,例如默认情况下主键就是一个索引。 ...

    索引的意义就不说了,参考其他资料,总之就是大大加快查询的速度。牺牲了小部分物理空间,毕竟索引也是要存的。(B+树原理)

    所以设计索引的时候尽量做到区分度好,例如默认情况下主键就是一个索引。
    经典的多对多学生选课模型,学生表students,课表courses,学生选课表sc
    实体联系模型
    CREATE TABLE student (
    Sno varchar(20) NOT NULL,
    Sname varchar(30) DEFAULT NULL,
    Ssex varchar(2) DEFAULT NULL,
    Sage int(11) DEFAULT NULL,
    Sdept varchar(30) DEFAULT NULL,
    PRIMARY KEY (Sno)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    这里可以用 show index from student 来查看索引
    查询结果

    1. Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。这里是主键,所以肯定是0啦
    2. Seq_in_index 索引中的列序列号,从1开始。这里sno是第一列,所以是1
    3. Collation 列以什么方式存储在索引中。有值‘A’(升序)或NULL(无分类)。
    4. Cardinality 索引中唯一值的数目的估计值。 我的表里大概有39个,随时变动。
    5. Sub_part    如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
    6. Packed    指示关键字如何被压缩。如果没有被压缩,则为NULL。
    7. Null     如果列是否含有Null值
    8. Index_type   用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)
    9. comment 注释什么的

    课程表
    CREATE TABLE course (
    Cno varchar(10) NOT NULL,
    Cname varchar(30) DEFAULT NULL,
    Chour int(11) DEFAULT NULL,
    Ccredit varchar(30) DEFAULT NULL,
    Cpno varchar(10) DEFAULT NULL,
    PRIMARY KEY (Cno)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    学生选课表的建立:

      CREATE TABLE `sc`(
          `Sno` varchar(20) NOT NULL,
          `Cno` varchar(10) NOT NULL,
          `Grade` int(11) DEFAULT NULL,
          PRIMARY KEY (`Sno`,`Cno`), 
          FOREIGN KEY (`Sno`) REFERENCES `student` (`Sno`),
          FOREIGN KEY (`Cno`) REFERENCES `course` (`Cno`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    查看sc表的索引
          这里很奇怪,为什么只有外键Cno有索引而Sno没有?研究一番发现复合索引的事。
         复合索引有最左原则,例如创建一个(a,b,c)索引,就相当于创建了(a),(a,b),(a,b,c)三个索引,如果我们的where语句中有a = … and b = …时也能用上,但是b = … and c = … 就用不上索引。所以设计复合索引的时候最常用的列名应该放在较前面的位置,这里 a 应该是常用的查询属性。

    这里我们的主键是两个列,组成一个复合索引,即(sno,cno),相当于(sno),(sno,cno),所以我们看到,外键自动创建的索引只有(cno),因为(sno)已经有过啦

    当然你也可以强制加索引,但是不建议,因为索引使用不当有很多缺点。
    CREATE TABLE sc (
    Sno varchar(20) NOT NULL,
    Cno varchar(10) NOT NULL,
    Grade int(11) DEFAULT NULL,
    PRIMARY KEY (Sno,Cno),
    KEY Cno (Cno),
    KEY Sno (Sno),
    CONSTRAINT sc_ibfk_4 FOREIGN KEY (Sno) REFERENCES student (Sno),
    CONSTRAINT sc_ibfk_5 FOREIGN KEY (Cno) REFERENCES course (Cno)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    这时候的索引
    详细内容参考链接

    https://www.cnblogs.com/chenshishuo/p/5030029.html

    展开全文
  • Mysql外键索引介绍

    千次阅读 2020-03-31 10:17:37
    今天在使用Navicat for mysql设计表时,在设置外键的时候,删除时和更新时两列有四个值可以选择:CASCADE、NO ACTION、RESTRICT、SET NULL,自己全亲自试了一遍,它们的区别如下: CASCADE:父表delete、update的...

    - 外键

    今天在使用Navicat for mysql设计表时,在设置外键的时候,删除时和更新时两列有四个值可以选择:CASCADE、NO ACTION、RESTRICT、SET NULL,自己全亲自试了一遍,它们的区别如下:

    CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;
    SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;
    RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;
    NO ACTION:同 RESTRICT,也是首先先检查外键;
    下面举一个小例子帮助理解:
    (1)在数据库bookshop中我新建了表a如下:
    在这里插入图片描述

    设置外键:
    在这里插入图片描述

    (2)在数据库bookshop中我新建了表b如下:

    在这里插入图片描述

    (3)给a、b表插入记录如下:
    在这里插入图片描述

    这里:a表id2字段为外键字段,参看b表的主键,所以b表是父表,a表是子表;然后分别在设置a表外键的时候设置不同的四个值,就可以得出我上述的结论。

    索引

    • 一、什么是索引?为什么要建立索引?

    索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。

    例如:有一张person表,其中有2W条记录,记录着2W个人的信息。有一个Phone的字段记录每个人的电话号码,现在想要查询出电话号码为xxxx的人的信息。如果没有索引,那么将从表中第一条记录一条条往下遍历,直到找到该条信息为止。如果有了索引,那么会将该Phone字段,通过一定的方法进行存储,好让查询该字段上的信息时,能够快速找到对应的数据,而不必在遍历2W条数据了。其中MySQL中的索引的存储类型有两种:BTREE、HASH。 也就是用树或者Hash值来存储该字段,要知道其中详细是如何查找的,就需要会算法的知识了。我们现在只需要知道索引的作用,功能是什么就行。

    • 二、MySQL中索引的优点和缺点和使用原则

    优点:

    1、所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引

    2、大大加快数据的查询速度

    缺点:

    1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

    2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

    3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

    使用原则:

    通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。

    1、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引,

    2、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。

    3、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可以建立索引。

    上面说的只是很片面的一些东西,索引肯定还有很多别的优点或者缺点,还有使用原则,先基本上理解索引,然后等以后真正用到了,就会慢慢知道别的作用。注意,学习这张,很重要的一点就是必须先得知道索引是什么,索引是干嘛的,有什么作用,为什么要索引等等,如果不知道,就重复往上面看看写的文字,好好理解一下。一个表中很够创建多个索引,这些索引度会被存放到一个索引文件中(专门存放索引的地方)

    • 三、索引的分类

    注意:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引

    MyISAM和InnoDB存储引擎:只支持BTREE索引, 也就是说默认使用BTREE,不能够更换MEMORY/HEAP存储引擎:支持HASH和BTREE索引

    1、索引我们分为四类来讲 单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引、

    1.1、单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。 这里不要搞混淆了。

    1.1.1、普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。

    1.1.2、唯一索引:索引列中的值必须是唯一的,但是允许为空值,

    1.1.3、主键索引:是一种特殊的唯一索引,不允许有空值。

    1.2、组合索引

    在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。这个如果还不明白,等后面举例讲解时在细说

    1.3、全文索引

    全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你是个靓仔,靓女 …" 通过靓仔,可能就可以找到该条记录。这里说的是可能,因为全文索引的使用涉及了很多细节,我们只需要知道这个大概意思,如果感兴趣进一步深入使用它,那么看下面测试该索引时,会给出一个博文,供大家参考。

    1.4、空间索引

    空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用SPATIAL关键字。要求,引擎为MyISAM,创建空间索引的列,必须将其声明为NOT NULL。具体细节看下面

    • 四、索引操作(创建和删除)

    4.1、创建索引

    4.1.1、创建表的时候创建索引
    在这里插入图片描述

    4.1.1.1、创建普通索引
    在这里插入图片描述

    上面两种方式创建都可以,通过这个例子可以对比一下格式,就差不多明白格式是什么意思了。
    在这里插入图片描述

    通过打印结果,我们在创建索引时没写索引名的话,会自动帮我们用字段名当作索引名。

    测试:看是否使用了索引进行查询。

    EXPLAIN SELECT * FROM book WHERE year_publication = 1990\G;

    解释:虽然表中没数据,但是有EXPLAIN关键字,用来查看索引是否正在被使用,并且输出其使用的索引的信息。
    在这里插入图片描述

    id: SELECT识别符。这是SELECT的查询序列号,也就是一条语句中,该select是第几次出现。在次语句中,select就只有一个,所以是1.

    select_type:所使用的SELECT查询类型,SIMPLE表示为简单的SELECT,不实用UNION或子查询,就为简单的SELECT。也就是说在该SELECT查询时会使用索引。其他取值,PRIMARY:最外面的SELECT.在拥有子查询时,就会出现两个以上的SELECT。UNION:union(两张表连接)中的第二个或后面的select语句 SUBQUERY:在子查询中,第二SELECT。

    table:数据表的名字。他们按被读取的先后顺序排列,这里因为只查询一张表,所以只显示book

    type:指定本数据表和其他数据表之间的关联关系,该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。ref用于连接程序使用键的最左前缀或者是该键不是 primary key 或 unique索引(换句话说,就是连接程序无法根据键值只取得一条记录)的情况。当根据键值只查询到少数几条匹配的记录时,这就是一个不错的连接类型。(注意,个人这里不是很理解,百度了很多资料,全是大白话,等以后用到了这类信息时,在回过头来补充,这里不懂对后面的影响不大。)可能的取值有 system、const、eq_ref、index和All

    possible_keys:MySQL在搜索数据记录时可以选用的各个索引,该表中就只有一个索引,year_publication

    key:实际选用的索引

    key_len:显示了mysql使用索引的长度(也就是使用的索引个数),当 key 字段的值为 null时,索引的长度就是 null。注意,key_len的值可以告诉你在联合索引中mysql会真正使用了哪些索引。这里就使用了1个索引,所以为1,

    ref:给出关联关系中另一个数据表中数据列的名字。常量(const),这里使用的是1990,就是常量。

    rows:MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数。

    extra:提供了与关联操作有关的信息,没有则什么都不写。

    上面的一大堆东西能看懂多少看多少,我们最主要的是看possible_keys和key 这两个属性,上面显示了key为year_publication。说明使用了索引。

    4.1.1.2、创建唯一索引

    CREATE TABLE t1

    (

    id INT NOT NULL,

    name CHAR(30) NOT NULL,

    UNIQUE INDEX UniqIdx(id)

    );

    解释:对id字段使用了索引,并且索引名字为UniqIdx。

    SHOW CREATE TABLE t1\G;                    
    在这里插入图片描述

    要查看其中查询时使用的索引,必须先往表中插入数据,然后在查询数据,不然查找一个没有的id值,是不会使用索引的。

    INSERT INTO t1 VALUES(1,‘xxx’);

    EXPLAIN SELECT * FROM t1 WHERE id = 1\G;
    在这里插入图片描述

    可以看到,通过id查询时,会使用唯一索引。并且还实验了查询一个没有的id值,则不会使用索引,我觉得原因是所有的id应该会存储到一个const tables中,到其中并没有该id值,那么就没有查找的必要了。

    4.1.1.3、创建主键索引

    CREATE TABLE t2

    (

    id INT NOT NULL,

    name CHAR(10),

    PRIMARY KEY(id)

    );

    INSERT INTO t2 VALUES(1,‘QQQ’);

    EXPLAIN SELECT * FROM t2 WHERE id = 1\G;

    在这里插入图片描述
      通过这个主键索引,我们就应该反应过来,其实我们以前声明的主键约束,就是一个主键索引,只是之前我们没学过,不知道而已。

    4.1.1.4、创建单列索引

      这个其实就不用在说了,前面几个就是单列索引。
    

    4.1.1.5、创建组合索引

    组合索引就是在多个字段上创建一个索引,创建一个表t3,在表中的id、name和age字段上建立组合索引

    CREATE TABLE t3

    (

    id INT NOT NULL,

    name CHAR(30) NOT NULL,

    age INT NOT NULL,

    info VARCHAR(255),

    INDEX MultiIdx(id,name,age)

    );

    SHOW CREATE t3\G;
    在这里插入图片描述

    解释最左前缀

    组合索引就是遵从了最左前缀,利用索引中最左边的列集来匹配行,这样的列集称为最左前缀,不明白没关系,举几个例子就明白了,例如,这里由id、name和age3个字段构成的索引,索引行中就按id/name/age的顺序存放,索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不构成索引最左面的前缀,那么就不会是用索引,比如,age或者(name,age)组合就不会使用索引查询

    在t3表中,查询id和name字段

    EXPLAIN SELECT * FROM t3 WHERE id = 1 AND name = ‘joe’\G;

    在这里插入图片描述
     在t3表中,查询(age,name)字段,这样就不会使用索引查询。来看看结果

    EXPLAIN SELECT * FROM t3 WHERE age = 3 AND name = ‘bob’\G;
    在这里插入图片描述

    4.1.1.6、创建全文索引

    全文索引可以用于全文搜索,但只有MyISAM存储引擎支持FULLTEXT索引,并且只为CHAR、VARCHAR和TEXT列服务。索引总是对整个列进行,不支持前缀索引,

    CREATE TABLE t4

    (

    id INT NOT NULL,

    name CHAR(30) NOT NULL,

    age INT NOT NULL,

    info VARCHAR(255),

    FULLTEXT INDEX FullTxtIdx(info)

    )ENGINE=MyISAM;

    SHOW CREATE TABLE t4\G;
    在这里插入图片描述
     使用一下什么叫做全文搜索。就是在很多文字中,通过关键字就能够找到该记录。

    INSERT INTO t4 VALUES(8,‘AAA’,3,‘text is so good,hei,my name is bob’),(9,‘BBB’,4,‘my name isgorlr’);

    SELECT * FROM t4 WHERE MATCH(info) AGAINST(‘gorlr’);
    在这里插入图片描述

    EXPLAIN SELECT * FROM t4 WHERE MATCH(info) AGAINST(‘gorlr’);                   [if !vml]

    在这里插入图片描述
      注意:在使用全文搜索时,需要借助MATCH函数,并且其全文搜索的限制比较多,比如只能通过MyISAM引擎,比如只能在CHAR,VARCHAR,TEXT上设置全文索引。比如搜索的关键字默认至少要4个字符,比如搜索的关键字太短就会被忽略掉。等等,如果你们在实验的时候可能会实验不出来。感兴趣的同学可以看看这篇文章,全文搜索的使用

    4.1.1.7、创建空间索引

    空间索引也必须使用MyISAM引擎, 并且空间类型的字段必须为非空。 这个空间索引具体能干嘛我也不知道,可能跟游戏开发有关,可能跟别的东西有关,等遇到了自然就知道了,现在只要求能够创建出来。

    CREATE TABLE t5

    (

    g GEOMETRY NOT NULL,

    SPATIAL INDEX spatIdx(g)

    ) ENGINE = MyISAM;

    SHOW CREATE TABLE t5\G;

    在这里插入图片描述

    4.1.2、在已经存在的表上创建索引

    格式:ALTER TABLE 表名 ADD[UNIQUE|FULLTEXT|SPATIAL]

    [INDEX|KEY] [索引名] (索引字段名)[ASC|DESC]

    有了上面的基础,这里就不用过多陈述了。

    命令一:SHOW INDEX FROM 表名\G

    查看一张表中所创建的索引

    SHOW INDEX FROM book\G;
    在这里插入图片描述

    挑重点讲,我们需要了解的就5个,用红颜色标记了的,如果想深入了解,可以去查查该方面的资料,我个人觉得,这些等以后实际工作中遇到了在做详细的了解把。

    Table:创建索引的表

    Non_unique:表示索引非唯一,1代表 非唯一索引, 0代表 唯一索引,意思就是该索引是不是唯一索引

    Key_name:索引名称

    Seq_in_index 表示该字段在索引中的位置,单列索引的话该值为1,组合索引为每个字段在索引定义中的顺序(这个只需要知道单列索引该值就为1,组合索引为别的)

    Column_name:表示定义索引的列字段

    Sub_part:表示索引的长度

    Null:表示该字段是否能为空值

    Index_type:表示索引类型

    4.1.2.1、为表添加索引

    就拿上面的book表来说。本来已经有了一个year_publication,现在我们为该表在加一个普通索引

    ALTER TABLE book ADD INDEX BkNameIdx(bookname(30));
    在这里插入图片描述

    看输出结果,就能知道,添加索引成功了。

    这里只是拿普通索引做个例子,添加其他索引也是一样的。依葫芦画瓢而已。这里就不一一做讲解了。

    4.1.2.2、使用CREATE INDEX创建索引。

    格式:CREATE [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] 索引名称 ON 表名(创建索引的字段名[length])[ASC|DESC]

    解释:其实就是换汤不换药,格式改变了一下而已,做的事情跟上面完全一样,做一个例子。

    在为book表增加一个普通索引,字段为authors。

    CREATE INDEX BkBookNameIdx ON book(bookname);

    在这里插入图片描述

    SHOW INDEX FROM book\G;  //查看book表中的索引

    在这里插入图片描述
    解释:第一条截图没截到,因为图太大了,这里只要看到有我们新加进去的索引就证明成功了。。其他索引也是一样的创建。

    4.2、删除索引

    前面讲了对一张表中索引的添加,查询的方法。

    添加的两种方式

    1在创建表的同时如何创建索引,

    2在创建了表之后如何给表添加索引的两种方式,

    查询的方式

    SHOW INDEX FROM表名\G;  \G只是让输出的格式更好看

    现在来说说如何给表删除索引的两种操作。

    格式一:ALTER TABLE 表名 DROP INDEX 索引名。

    很简单的语句,现在通过一个例子来看看,还是对book表进行操作,删除我们刚才为其添加的索引。

    1、删除book表中的名称为BkBookNameIdx的索引。

    ALTER TABLE book DROPINDEX BkBookNameIdx;
    在这里插入图片描述

    SHOW INDEX FROM book\G;  //在查看book表中的索引,就会发现BkBookNameIdx这个索引已经不在了

    在这里插入图片描述
    格式二:DROP INDEX 索引名 ON 表名;

    删除book表中名为BkNameIdx的索引

    DROP INDEX BkNameIdx ON book;

    SHOW INDEX FROM book\G;
    在这里插入图片描述

    • 五、总结

    MySQL的索引到这里差不多就讲完了,总结一下我们到目前为止应该知道哪些东西

    1、索引是干嘛的?为什么要有索引?

    这个很重要,需要自己理解一下,不懂就看顶部的讲解

    2、索引的分类

    3、索引的操作

    给表中创建索引,添加索引,删除索引,删除索引

    展开全文
  • mysql外键索引

    2015-08-07 16:42:15
    mysql在创建外键的时候会自动添加索引,oracle就不会,这样避免了死锁的产生,提高查询效率 mysql> create table f(id int primary key); Query OK, 0 rows affected (0.05 sec) mysql> create table c(id ...

    mysql在创建外键的时候会自动添加索引,oracle就不会,这样避免了死锁的产生,提高查询效率

    mysql> create table f(id int primary key);
    Query OK, 0 rows affected (0.05 sec)


    mysql> create table c(id int , foreign key(id) references f(id));
    Query OK, 0 rows affected (0.02 sec)


    mysql> show index from c;
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+--------
    -------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_c
    omment |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+--------
    -------+
    | c     |          1 | id       |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |
           |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+--------
    -------+
    1 row in set (0.00 sec)


    mysql> drop index id on c;
    ERROR 1553 (HY000): Cannot drop index 'id': needed in a foreign key constraint
    mysql>

    展开全文
  • Mysql外键作用和用法

    2020-12-04 17:24:55
    章节目录语法约束概念示例设置为RESTRICT设置为CASCADE设置为SET NULL注意事项创建外键删除外键 语法 ALTER TABLE 子表 ADD CONSTRAINT 外键名 FOREIGN KEY (子表列) REFERENCES 主表名(主表列) ON DELETE + ...
  • 什么是外键? 我也说不清楚! 但还是用自己的语言描述一下。 有些关系数据无用一个表来完整表达,所以需要建立另外一个相关的表,于是他们存在一个引用关系,这个引用就需要使用外键。 真实例子 一家公司,公司...
  • ①参照列没有索引的话,MySQL会自动创建索引,因为参照列含有主键,创建主键时MySQL会默认创建所用; ②外键列的索引也是MySQL根据参照列自动创建的。 转载于:https://my...
  • 外键列必须建立了索引MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;  3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以...
  • 前两天被朋友问到一个有关MySQL外键的问题,一下子触及到了知识的盲点,当时有些懵圈。支持事务的InnoDB成为MySQL的默认存储引擎后,在高并发的系统中,很少见到MySQL表使用外键了(我参与的几个项目数据库中都没有...
  • 在使用srping data JPA时候,配置了很多类似 一对多的配置,导致在生成数据库在mt_sys_file生成了多个外键约束,最后在保存数据的时候可能出现“违反数据库约束”,例如: ...
  • 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。...
  • mysql主键 外键 索引

    2016-07-03 09:44:04
    http://blog.csdn.net/duck_arrow/article/details/8264686
  • MySQL-外键索引

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

    万次阅读 多人点赞 2018-08-27 09:54:51
    mysql外键设置方式/在创建索引时,可指定在delete/update父表时,对子表进行的相应操作, 包括: restrict, cascade,set null 和 no action ,set default. restrict,no action: 立即检查外键约束,如果子表有匹配...
  • MySQL-外键+索引

    千次阅读 2019-01-10 17:03:22
    外键 描述: 外键是表的一个特殊字段; 被参照的表是主键,外键所在字段的表为子表; 设置外键的原则就是依赖于数据库中已存在的表的主键; 作用: 建立该表与其父表的关联关系,父表中对记录做操作时,子表中与之...
  • 外键索引,主键和索引区别于联系
  • 索引类型: 普通索引 == index【索引名称】(字段名)或 key(字段名) 不具备唯一性 允许...外键约束: 基本语法: create table表名(字段… foreign key(字段名) inferences 主表名(字段) on delete cascade on
  • MySQL 视图、索引外键关联策略

    千次阅读 2020-05-30 11:29:12
    目录视图索引外键关联策略   视图 视图是一张虚表,将查询结果集保存起来,作为视图使用。实际存在的表叫作基本表。   视图的作用 提高安全性。grant授权用户只能操作视图,通过视图来操作基本表,可以...
  • 定义主键--唯一标识一条记录,不能有重复的,不允许为空外键--表的外键是另一表的主键, 外键可以有...个数主键--主键只能有一个外键--一个表可以有多个外键索引--一个表可以有多个唯一索引 转载于:https://www...
  • 创建索引 create index ACT_IDX_EVENT_SUBSCR_CONFIG_ on ACT_RU_EVENT_SUBSCR(CONFIGURATION_); create index ACT_IDX_VARIABLE_TASK_ID on ACT_RU_VARIABLE(TASK_ID_); create index ACT_IDX_ATHRZ_PROCEDEF on ...
  • 详解MySQL 外键约束

    2020-12-14 08:20:16
    外键列必须建立了索引MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而...
  • MySQL外键使用详解

    2020-12-15 17:17:05
    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下...使用在外键关系的域必须为索引型(Index)。 使用在外键关系的域必须与数据类型相似 (5)创建的步骤 指定主键关键字:
  • 文章目录一、外键约束1、外键概念2、关联约束3、添加与删除外键4、集联删除二、MySQL索引1、创建唯一索引(三种方法)2、索引查询3、全文索引4、联合索引5、删除索引 一、外键约束 1、外键概念 外键:给关联字段创建...
  • mysql给创建的外键自动建立索引吗?

    千次阅读 2014-03-13 17:36:48
    答案是肯定的,版本号是5.1,但是貌似听说5.5之后就不会了。 如何查看呢,其实你就查看下这个表中所有...key_name:索引名字,可以看出来所帮我们自动创建的索引的名字就是那个列 Seq_in_index:索引中的列数,比如联合
  • Mysql 外键的详解和实例

    千次阅读 2018-01-06 10:31:00
    摘要: 外键具有保持数据完整性和一致性的机制,目前MySQL只在InnoDB引擎下支持,下面实例下一个小操作来说明下外键的关联操作,用来保持数据的完整性和一致性。 外键具有保持数据完整性和一致性的机制,对业务处理...
  • 外键索引的对象不是主键 ③建表引擎不为InnoDB ④外键名字重复 ⑤Charset和Collate选项在表级和字段级上不一致 ⑥为外键设置了默认值 default=0 ⑦语法错误 但我在使用时错误都不在内 我建立的是一个学生考勤管理...
  • mysql外键操作

    2020-02-25 15:13:49
    增加外键 msyql中提供了两种方式增加外键 方案1:在创建表的时候增加外键(类似主键) 基本语法:在字段后增加一条语句 [constraint`外键名`] foreign key(外键字段) references 主表(主键) create table my_...
  • MYSQL -外键索引

    千次阅读 2019-03-08 20:15:23
    9:59 2019/3/8/周五 ...数据库之间的关联数据库(通过外键来约束) 比如一个表中的key_id和另一个表classcharge的id之间有关联,这个时候应该在里面加入{ foreign key(key_id) references class...
  • 1、字段修饰符(约束) 1.1、null和not null 修饰符 有not null修饰的字段不能插入null值,可以插入“空值...null占用空间,所有mysql在进行比较的时候,null会参与字段比较,对效率有一部分影响 1.2、default设定字

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,340
精华内容 27,736
关键字:

mysql外键索引

mysql 订阅