-
2021-07-17 15:36:46
主键和索引的关系
一. 主键
- 主键的唯一作用就是唯一标识表中的某一行数据。
分为单一主键和联合主键
- 单一主键:只用一列就能唯一标识一行。
- 联合主键:当使用一列已经不能唯一标示一行的时候,就要采用多列唯一标识一行,就是联合主键。
二. 索引
- 索引的作用就是提高数据的检索速度。
分为单一索引和联合索引:
- 单一索引:只是用某一列数据作为索引,默认是index索引,这一列可以包含重复数据;如果某一列不存在重复数据最好设置成unique形式的索引,比index的索引速度更快,在text数据上要使用fulltext索引。
- 联合索引:为了更进一步提高检索速度,每次检索都需要用多列同时进行时,就可以把这多列设为联合索引,提高索引速度,根据多列是否唯一,也分为index索引和unique索引。
三. 主键和索引总结
- 主键一定是索引,但是索引不一定是主键。
- 一个表只能有一个主键或联合主键,但是可以有多个索引。
- 主键字段必须不能为空,但是索引字段可以为空。
更多相关内容 -
MySQL 主键与索引的联系与区别分析
2021-01-19 22:24:35下面是主键和索引的一些区别与联系。 1. 主键一定是唯一性索引,唯一性索引并不一定就是主键。 所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一... -
聚簇索引与主键的选择
2020-12-14 15:21:49聚簇索引与主键的选择一、什么是聚簇索引?二、什么是非聚簇索引?1. InnoDB引擎中2. MyISAM引擎中三、聚簇索引的优劣与主键选择的关系 ...主键索引就是一种聚簇索引,而其他创建出来的前缀索引、联合索引,唯 -
SQL Server研习录(28)——主键与索引的关系与区别
2020-07-23 16:06:45SQL Server研习录(28)——主键与索引的关系与区别版权声明一、什么是主键?二、什么是索引?三、主键和聚集索引的区别四、复合主键的重复值 版权声明 本文原创作者:清风不渡 博客地址:...SQL Server研习录(28)——主键与索引的关系与区别
版权声明
- 本文原创作者:清风不渡
- 博客地址:https://blog.csdn.net/WXKKang
此篇博客主要是为了将主键与索引的知识进行一个系统的总结,并将他们的关系与区别记录下来,进行一次梳理,如有错误,欢迎各位指正
一、什么是主键?
主键(PRIMARY KEY)就像我们的身份证号一样是唯一的,如果我们将一个表中的某一列定义为了主键,那么在该表的数据中,这个字段的值就不能重复,且不可以为NULL值,主键(PRIMARY KEY)约束是数据库表中的每条记录的唯一标识
注:若需了解主键的详细知识,请移步我的另一篇博客:SQL研习录(20)——主键约束二、什么是索引?
索引(INDEX)就像是一本书的目录一样,当我们想要查询一本书中与某个特定主题相关的所有页面的时候,我们会先去查询目录(索引),它按照字母表顺序列出了所有主题,然后从索引中就可以找到一页或多页与该主题相关的页面,简单来说,索引就是指向表中数据的指针
并且索引分为:唯一索引、主键索引、聚集索引、非聚集索引、复合索引、全文索引、隐式索引
注:若需了解索引的详细知识,请移步我的另一篇博客:SQL研习录(25)——索引三、主键和聚集索引的区别
我们知道,当我们在一张表上定义一个主键的时候,sql server会自动为它创建主键索引,它要求主键中每个值是非空并且唯一的
那么,建立在主键之上的索引就一定是聚集索引吗?显然不是的,我们在创建表的时候就可以指定主键是否为聚集索引,代码如下:USE [DEMO] GO CREATE TABLE PKCL_DEMO( ID INT PRIMARY KEY CLUSTERED --聚集索引 ) GO CREATE TABLE PKNCL_DEMO( ID INT PRIMARY KEY NONCLUSTERED --非聚集索引 ) GO DROP TABLE PKCL_DEMO DROP TABLE PKNCL_DEMO GO
注:如果不添加CLUSTERED或NONCLUSTERED关键字,那么默认为聚集索引
并且,像上面给主键指定索引,不论它是聚集索引还是非聚集索引,该列的值都是不能重复的
但是如果该列不是主键并且该列上的索引为聚集索引,那么该列的值是可以重复的四、复合主键的重复值
如果一个表中有一个主键的时候,那么该列的值一定是不能重复并且不能为NULL值的
但是一个表中的主键为多个列组成的复合主键时,其中某一列的值是可以重复的,但必须保证组成主键的这几个列的组合必须是唯一的 -
oracle的主键和索引的关系是什么?
2021-05-04 03:13:34满意答案heteCreardy推荐于 2019.10.27采纳率:42%等级:12已帮助:5778人在oracle中,我们创建一个主键,则同时自动创建了一个同名的唯一索引;删除主键,则主键约束和对应的唯一索引都删除了。这是我们经常见到的...满意答案
heteCreardy
推荐于 2019.10.27
采纳率:42% 等级:12
已帮助:5778人
在oracle中,我们创建一个主键,则同时自动创建了一个同名的唯一索引;删除主键,则主键约束和对应的唯一索引都删除了。这是我们经常见到的现象。
发出一个创建主键的sql,oracle其实执行了两步:创建主键约束、创建/关联 唯一索引。步骤是这样的:
创建主键约束时,检查该主键字段上是否已经存在唯一索引。若不存在,则自动创建同名唯一索引;若存在,则直接创建主键约束,并将该约束和已经存在的唯一索引对应上。
删除主键约束时,可以决定是否保留对应的索引;删除唯一索引时,若存在对应的主键约束,则不能删除。
总之,存在主键约束,则肯定存在与之对应的唯一索引,而存在唯一索引,不一定对应着有主键约束。
下面我们验证一下:
SQL> create table test_pri(a number(1), b number(1));
表已创建。
--1.创建主键,则自动创建同名唯一索引
--1.1创建主键,主键约束和唯一索引同时创建
SQL> alter table test_pri add constraint pk_test_pri_a primary key(a);
表已更改。
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
2 from user_constraints where table_name = 'TEST_PRI';
CONSTRAINT_NAME TABLE_NAME INDEX_NAME
----------------- ------------ -------------
PK_TEST_PRI_A TEST_PRI PK_TEST_PRI_A
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
2 from user_indexes where table_name = 'TEST_PRI';
INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
---------------- ------------ ------------ ---------
PK_TEST_PRI_A NORMAL TEST_PRI UNIQUE
--1.2 删除主键,主键约束和对应的唯一索引都删除了
SQL> alter table test_pri drop constraint pk_test_pri_a;
表已更改。
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
2 from user_constraints where table_name = 'TEST_PRI';
未选定行
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
2 from user_indexes where table_name = 'TEST_PRI';
未选定行
--1.3其实删除主键时可以选择保留索引的
SQL> alter table test_pri add constraint pk_test_pri_a primary key(a);
表已更改。
SQL> alter table test_pri drop constraint pk_test_pri_a keep index;
表已更改。
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
2 from user_constraints where table_name = 'TEST_PRI';
未选定行
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
2 from user_indexes where table_name = 'TEST_PRI';
INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
--------------- ----------- ----------- ---------
PK_TEST_PRI_A NORMAL TEST_PRI UNIQUE
--2.在存在唯一索引的列上创建主键,则只创建主键约束,同时将该约束与已有唯一索引关联上(名称可以不一致)
SQL> drop index pk_test_pri_a;
索引已丢弃。
--2.1 先创建唯一索引,再创建主键,名称可以不一致
SQL> create unique index pk_test_pri_a on test_pri(a);
索引已创建。
SQL> alter table test_pri add constraint pk_test_pri primary key(a);
表已更改。
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
2 from user_indexes where table_name = 'TEST_PRI';
INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
--------------- ----------- ------------ ---------
PK_TEST_PRI_A NORMAL TEST_PRI UNIQUE
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
2 from user_constraints where table_name = 'TEST_PRI';
CONSTRAINT_NAME TABLE_NAME INDEX_NAME
------------------ ------------ -------------
PK_TEST_PRI TEST_PRI PK_TEST_PRI_A
--2.2 不可删除存在主键约束的唯一索引
SQL> drop index PK_TEST_PRI_A;
drop index PK_TEST_PRI_A
*
ERROR 位于第 1 行:
ORA-02429: 无法删除用于强制唯一/主键的索引
--2.3虽然两者名称不一致,但也是关联在一块的:删除约束,则对应的索引同时删除
SQL> alter table test_pri drop constraint pk_test_pri;
表已更改。
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
2 from user_indexes where table_name = 'TEST_PRI';
未选定行
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
2 from user_constraints where table_name = 'TEST_PRI';
未选定行
SQL>
10分享举报
-
主键与索引
2019-06-01 20:49:03MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。主要分为两种类型,单列索引和组合索引。...主键本身也是一种索引。 建表时创建单列索引和组合索引示例: CRE...MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。主要分为两种类型,单列索引和组合索引。
说明:
UNIQUE:可选。表示索引为唯一性索引。
FULLTEXT:可选。表示索引为全文索引。
SPATIAL:可选。表示索引为空间索引。
INDEX和KEY:用于指定字段为索引,两者作用是一样的主键本身也是一种索引。
建表时创建单列索引和组合索引示例:
CREATE TABLE classInfo(
id INT AUTO_INCREMENT COMMENT ‘id’,
classname VARCHAR(128) COMMENT ‘课程名称’,
classid INT COMMENT ‘课程id’,
classtype VARCHAR(128) COMMENT ‘课程类型’,
classcode VARCHAR(128) COMMENT ‘课程代码’,
– 主键本身也是一种索引
PRIMARY KEY (id),
– 给classid字段创建了唯一索引(注:也可以在上面创建字段时使用unique来创建唯一索引)
UNIQUE INDEX (classid),
– 给classname字段创建普通索引
INDEX (classname),
– 创建组合索引
INDEX (classtype,classcode)
– 指定使用INNODB存储引擎(该引擎支持事务)、utf8字符编码
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT ‘课程明细表’;普通索引:最基本的索引,没有任何限制
唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它 是一种特殊的唯一索引,不允许有空值。
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。主键(起快速查询与唯一标识作用)
表中每一行都应该有可以唯一标识自己的一列(或一组列)
主键(primary key) 一列(或一组列),其值能够唯一区分表中的每个行。
唯一标识表中每行的这个列(或这组列)称为主键。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只设计相关的行。 -
数据库之主键与索引
2020-06-02 18:52:52关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 ... -
主键与索引的区别
2020-10-16 10:33:53在数据库关系图中为表定义主zhi键将dao自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。 2、种类不同: 根据数据库的... -
联合主键和索引
2022-03-30 11:13:59主键和索引的关系为: 1)主键一定是索引; 2)索引是可以自建的,非主键; 3)索引是一种数据结构,方便查找。 联合主键的本质,就是一个联合起来造成的索引,用来作为表的主键。 但联合主键要想用起来,必须... -
mysql 中主键和索引的关系和说明
2019-02-13 14:01:16mysql数据库: 主键 索引 关系 1.主键:主键的唯一作用就是唯一标识表中的某一行数据。分为单一主键和联合主键: 单一主键:只用一列就能唯一标识一行。 联合主键:当使用一列已经不能唯一标示一行的时候,就要... -
Mysql数据库中的主键与索引
2020-12-16 15:04:34由于在工作中遇到了多个进程读写数据库容易造成死锁并且更新时的查询数据特别慢这个问题,所以总结了一下关系型数据库的主键和索引的知识。 1、什么是索引? 索引是一种加快海量数据查询的技术。索引就像是小时候的... -
数据库索引相关(主键索引和非主键索引区别)
2022-03-01 14:36:35索引基础 关于索引的知识可以看:SQL索引(INDEX)。 简单概括就是:为数据库某些字段增加索引是可以加快查询速度的,并且一个表是可以创建多个索引的,而一个索引可以包含多个字段。 如果不使用索引,则数据库... -
MySQL 主键和索引
2021-08-30 09:48:11主键:关系数据可依赖于主键,主键在物理层面上主要有两个用途: 唯一的标识一行 因为主键可以唯一标识一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。 作为一个可以被外键引用的对象 ... -
复合主键与联合主键、索引与联合(复合)索引
2018-09-24 22:11:31前几天面试时被问到了MySql中联合索引使用与生效问题;回来顺便看了一下复合主键与联合主键,查漏补缺,慢慢学习吧。 一、复合主键与联合主键 1、复合主键:指表的主键含有一个以上的字段组成,不使用无业务含义的... -
MySQL添加主键、索引
2021-01-18 19:42:03查看索引SHOW INDEX FROM ...添加索引alter table 数据库add index 索引名称(数据库字段名称)主键索引ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )比如:ALTER TABLE order_info ADD PRIMARY KEY (o... -
Mysql 为什么用自增列作为主键?主键与聚集索引的关系
2022-02-17 10:32:24一、定义 ...聚集索引:指索引项的排列顺序方式与表中记录的排列顺序一致的索引。也就是说聚集索引的排列顺序就是数据的物理存储顺序。他会根据聚集索引键的顺序来存储表中数据,即对表中的数据按索引.. -
MySQL主键和索引的联系及区别
2021-02-02 04:23:58MySQL主键和索引的联系及区别转载自:关系数据库依赖于主键,它是数据库物理模式的基石。主键在物理层面上只有两个用途:惟一地标识一行。作为一个可以被外键有效引用的对象。索引是一种特殊的文件(InnoDB数据表上的... -
MYSQL:聚簇索引和主键索引
2021-01-19 03:26:59聚簇索引和主键索引聚簇索引并不是一种单独的索引类型,而是一种数据存储方式,具体细节依赖于其实现方式。MySQL数据库中innodb存储引擎,B+树索引可以分为:聚簇索引(也称聚集索引,clustered index)辅助索引(有时... -
clickhouse 主键、索引的工作机制
2021-03-24 09:38:12MergeTree的稀疏索引 数据按照主键排序后存储的 每个索引记录对应8192条(由index——grandularity指定) 记录索引是常驻内存的...根据主键的查询条件,确定索引范围。 id in (‘A02’,‘A08’),转化为索引范围区间[A01 -
主键索引和非主键索引
2019-09-07 22:38:40非主键索引和主键索引的区别是:非主键索引的叶子节点存放的是主键的值,主键索引的叶子节点存放的是整行数据。其中,非主键索引又称为二级索引,主键索引又称为聚簇索引。 根据这两种结构我们来进行下查询,看看... -
(转)复合主键与联合主键、索引与联合(复合)索引
2019-10-31 16:50:50一、复合主键与联合主键 1、复合主键:指表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。 create table test( name varchar(19), id number, value varchar(10), primary key (name,id) ) 上面... -
MySQL的几个概念:主键,外键,索引,唯一索引
2021-01-18 21:25:56转自:...主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。外键(f... -
浅谈主键索引与唯一索引
2017-11-16 18:57:38主键索引与唯一索引 一、主键索引定义 主键索引是唯一索引的特殊类型。 数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义一个主键将自动创建主键索引,... -
主键、外键和索引的关系
2020-11-16 15:16:30简介 主键:唯一标识一条记录,不能有重复的,不允许为空。 外键:表的外键是另一个表的主键,外键可以有重复的,可以是空值。...2、使用主键会自动创建索引(唯一索引),也可以在非主键上创建索引。 ... -
数据表关系模型---- 主键 和 索引
2019-08-21 19:52:16对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。 对主键的要求,最关键的一点是:记录一旦插入... -
唯一索引与主键索引的比较
2019-02-20 23:02:51如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在 employee 表中的职员姓氏(lname) 列上创建了唯一索引... -
主键索引和辅助索引的区别(MyISAM和InnoDB)
2021-09-13 17:02:28首先,主索引就是主键索引,辅助索引就是别的索引 MyISAM索引实现: 概述: MyISAM索引文件和数据文件是分离的,MyISAM的索引文件仅仅保存数据记录的地址。 在MyISAM中,主索引和辅助索引在结构上没有任何区别,... -
mysql与pg的主键索引说明
2020-06-19 09:53:27mysql与pg的主键说明mysql插入顺序与插入随机测试案例B+Tree原理id顺序的方式插入随机的方式插入Postgresql堆组织表CTIDPg的元组及索引原理Pg与mysql与oracel问题 mysql 插入顺序与插入随机测试案例 创建了两张表 ...