外键相对于主键而言,用来引用其他表。外键通过子表的一个或多个列对应到父表的主键或唯一键值,将子表的行和父表行建立起关联关系。 例如,Sakila 示例数据库中的 country 表和 city 表。...我们可以使用以下 3 个策略中的一个: CASCADE:如果被引用的表中的一行被删除或更新,该表中匹配行的值会自动删除或更新。...SET NULL:如果被引用的表中的一行被删除或更新,该表中匹配行的值设置为 NULL。...RESTRICT: 如果被引用的表中的一行在该表中有匹配的行,试图删除或更新被引用的表中行时会引发 MySQL 错误。这是默认的策略。...当父表的行的键值更新的时候,子表中匹配的行的字段也会被更 3.3、唯一键约束 唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性。
,"DBAs"); 查询刚刚插入的规则: ? 输出的规则每一列的内容如下: id: 规则ID。此列是表主键。可以使用该ID唯一标识任何规则。 pattern: 指示规则匹配的语句模式的模板,使用?...表示匹配的数据值。 pattern_database: 该数据库用于匹配语句中的非限定表名。...此列可以在不删除规则的情况下停用规则:将列设置为除YES表之外的值 ,然后将表重新加载到插件中。 message: 该插件使用此列与用户进行通信。...如果将规则表加载到内存中时没有发生错误,则插件会将message 列设置为NULL。非NULL值表示错误,列内容是错误消息。...在这些情况下可能会发生错误:1.模式或替换是一个产生语法错误的错误SQL语句。2.替换包含比模式更多的参数标记。
如两个RelNode进行Join时,Join返回记录数多少由的主键侧记录数选择率和外键侧非重复值的UniqueKeys唯一键共同决定的。...强调一点,这里讲到主键侧PK side不是指其主键,是带有主键的那一侧,就JoinKey关联键外键而言,它是重复的,如员工表的外键部门编号就是含有重复值的,所以使用主键侧的选择率和外键的非重复记录数进行估算...Hive优化器原理与源码解析系列—统计信息中间结果估算文章只是提到了UniqueKeys唯一键的使用,但没有展开UniqueKeys唯一键是如何识别的,接下来我们讲解分析。...遍历每列的统计信息的NDV(Number of Distinct Value)与中记录数进行表,如果非重复个数大于或等于总记录数数,说明此列为UniqueKey。...} colStatsPos++;//统计信息的位置递增, } return keys;//返回非重复的keys列表 判断每列是否为主键列,组成的集合并返回。
唯一索引是这样一种索引,它通过确保表中没有两个数据行具有完全相同的键值来帮助维护数据完整性。 换个说法,有了唯一索引就可以确保数据表不会有相同行数据(组成唯一索引键的列)....唯一索引允许空值的存在,空值将视为。如果由单列组成唯一索引,则此列仅允许一个空值存在;如果由多列组成唯一索引,则值与空值的组合仅允许一个存在。 1.1 唯一键约束 什么是唯一键约束?...唯一键约束与唯一索引又有什么区别? 唯一键约束与唯一索引的区别只有一个:唯一键约束不允许空值的存在,而唯一索引是允许空值的存在的。 2....又叫普通索引,应当为经常出现在查询条件 where 或排序条件 order by的列建立普通索引。 3....数据表通常用一列或多列来唯一标识行数据,这一列或多列就是主键。 Q:主键索引与唯一索引有啥区别呢? A:1. 主键不允许空值存在的;2. 一个表仅有一个主键。
SUBQUERY subquery 表示在 select 的结果字段列表或 where 条件中包含的子查询。 3.2.5. UNION union 表示一个 union 查询的子查询。 3.2.6....Null 表示在优化器优化后就已经得到结果,不需要再通过执行器访问存储引擎来实现查询操作,例如: explain select max(id) from person; 3.5.2. const 当使用主键或惟一键进行查询且只匹配一行时...3.5.3. eq_ref 对于每个来自于前面的表的行组合,从该表中读取一行,并通过这一行可以通过主键或惟一键定位到聚簇索引中具体的一系列数据。...如果此列是 NULL,则没有相关的索引。 3.7. key key 列指出了 MySQL 优化器最终选定的索引。...3.9. ref 该字段显示使用哪个列或常数与 key 一起从表中选择数据行,有三种选项可选: NULL — 不使用索引 func — 用于索引匹配的值是函数计算的结果 const — 用于索引匹配的值是常量
只能查看已存在的表 本质上是打印出来创建表的时候执行的所有语句 省略长横线: 新增列(新增字段) 在SC表中的Cno列后面新增一列Grade 如果不加after,默认加在最后一列 新增一列之后,此列的数据默认为...设置现有列(字段)为主键 在添加新字段时设置为主键 前提是表中没有主键 设置复合主键 创建新表时设置 不能用第一种方式创建 会报错“定义了重复主键” 设置现有字段为复合主键 此前表中没有主键 更多...,其主键或唯一键,与表中现存数据重合,则插入数据失败。...在test表中插入数据Sno、Sage(Sno必填,因为是主键),如果填入的内容与主键发生重复冲突,则更新update语句后面指定字段中的内容 示例中是,如果发生主键/唯一键冲突,则将该主键/唯一键对应的数据中...要插入的数据的主键/唯一键与现有数据冲突时,replace将现有数据所有字段删除,将要插入的数据重新插入。即replace在遇到冲突时,是先删除,后插入。
MySQL分区类型主要包括:range分区、list分区、hash分区、key分区; 无论是那种MySQL分区类型,要么分区表上没有主键/唯一键,要么分区表的主键/唯一键都必须包含分区键,也就是说不能使用主键.../唯一键字段之外的其他字段分区。...如果增加商店ID大于等于30的行,超出分区范围,会出现错误。...将要匹配的任何值都必须在值列表中。 四:Hash 分区 Hash 分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布。...分区支持使用 Blob 或 Text 类型外其他类型的列作为分区键 创建 Key 分区表的时候,可以不指定分区键,默认会首先选择使用主键作为分区键 在没有主键的情况,会选择非空唯一键作为分区键,分区键的唯一键必须是非空的
它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。...PRIMARY KEY主键约束不能重复,不能为空NOT NULL 非空约束不能为空DEFAULT默认约束插入数据时此列没有值插入,则使用默认值UNIQUE KEY唯一约束此列不能有重复值FROEIGN...no action方式:不作为,同4 restrict方式:如果主表被依赖字段的值被从表引用了,那么主表对该字段的修改和删除就被完全限制了,主表没有主动权,必须先处理从表的值。...add constraint 约束名 check (列名 between 1 and 100) 注:MYSQL不支持 四、唯一约束(unique constraint) 一个表可以有多个唯一约束,唯一键意味着唯一...ID值有自动递增的特性,当语句执行失败或事务回滚时,ID值不会回滚,这会导致ID列的值不连续。
DOUBLE_VAL:参数值,如果类型是双倍的。 IDENTIFYING:指示参数是否有助于相关身份的标志JobInstance。 请注意,此表没有主键。这是因为框架没有用于一个,因此不需要它。...以下清单显示了该BATCH_JOB_EXECUTION 表的定义: 以下列表描述了每列: JOB_EXECUTION_ID:唯一标识此执行的主键。...当作业当前未运行时,此列中的空值表示存在某种类型的错误,并且框架无法在失败之前执行上次保存。 STATUS:表示执行状态的字符串。这可能是 COMPLETED,STARTED等等。...以下清单显示了该BATCH_STEP_EXECUTION表的定义: 以下列表描述了每列: STEP_EXECUTION_ID:唯一标识此执行的主键。...END_TIME:表示执行完成时的时间戳,无论成功或失败。即使作业当前未运行,此列中的空值也表示存在某种类型的错误,并且框架无法在失败之前执行上次保存。 STATUS:表示执行状态的字符串。
(从磁盘取数据是最影响性能的) Join 对Join语句匹配关系(on)涉及的字段建立索引能够提高效率 索引覆盖 如果要查询的字段都建立过索引,那么引擎会直接在索引表中查询而不会访问原始数据(否则只要有一个字段没有建立索引就会做全表扫描...2.哈希索引 简要说下,类似于数据结构中简单实现的Hash表(散列表)一样,当我们在MySQL中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法...八、索引设计的原则? 1.适合索引的列是出现在Where子句中的列,或者连接子句中指定的列。 2.基数较小的类,索引效果较差,没有必要在此列建立索引。...使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况: 基于一个范围的检索,一般查询返回结果集小于表中记录数的30% 基于非唯索引的检索 十三、百万级别或以上的数据如何删除...在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。
但从更新上来看,如果数据不在内存中,唯 一索引需要将数据从磁盘上读取到内存中,这样会引发随机读,导致IO消耗增多,而普通索引可以利用change buffer,IO上边要节省很多。...这是const连接类型的特殊情况。 const: 表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。...eq_ref: 在连接中,MySQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用。...ref: 这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。...这个类型严重依赖于根据索引匹配的记录多少—越少越好。 range: 这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况。
索引结构 关系数据库会自动对其创建主键索引,使用主键索引的效率是最高的,因为主键会保证绝对唯一 有B+树和哈希,B+树的索引三层但已经足够使用了,使用哪种是引擎所决定,不是我们能干预 B+树(log N...): 第一层:最大目录项 第二次:普通目录项 第三层:主键存放记录的地址,非主键存放主键和索引项 Hash: 没有排序 键大量重复效率也低,哈希碰撞 4....聚集和非聚集索引 聚集索引:索引键值的逻辑顺序与表中记录的物理顺序一致(主键索引,叶子节点存放记录的地址) 非聚集索引:索引键值的逻辑顺序与表中记录的物理顺序不一致(非主键索引,叶子节点存放主键和索引项...最左匹配原则 使用索引是从左到右匹配索引字段,前一个不匹配,后一个就不使用索引,所以总是从第一个开始匹配,因为B+树只能以一个值(即主键)来建树 联合索引时,索引只能用于查找key是否存在或相等,遇到范围查询...(>、<、between、like),就不能进一步匹配了,退化为线性查询,因此列的排列顺序决定了可命中索引的列数 ----
索引和键的混淆通常是由于数据库使用索引来实施完整性约束。 接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。...,而且也不允许再在此列上创建唯一索引或非唯一索引。...* from test; ID NAME ———- ——————– 1 Sally Tony Jack 从实验结果来看,唯一键约束并没有非空要求...如果我们让主键约束或者唯一键约束失效,Oracle自动创建的唯一索引是否会受到影响? SQL> drop table test purge; Table dropped....总结如下: (1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除; (2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空; (3)
并且组合的值不允许重复 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引 CREATE TABLE 表名称( 字段名 数据类型 PRIMARY KEY, #列级模式 字段名 数据类型...); #字段列表可以是一个字段,也可以是多个字段,如果是多 个字段的话,是复合主键 ALTER TABLE 表名称 ADD PRIMARY KEY(字段名1,字段名2); 4、自增长约束 某个字段的值自增...一个表最多只能有一个自增长列 当需要产生唯一标识符或顺序值时,可设置自增长 自增长列约束的列必须是键列(主键列,唯一键列) 自增约束的列的数据类型必须是整数类型 -- 建表 CREATE TABLE...从表的外键列,必须引用/参考主表的主键或唯一约束的列 在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名(例如student_ibfk_1;),也可以指定外键约束名。.../delete掉子表的匹配记录 Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null No action方式:如果子表中有匹配的记录
默认值是字符串"auto",表示应自动为单列(即非复合)主键提供自动递增语义,该主键为 INTEGER 类型且没有其他客户端或服务器端默认构造指示。...这基于由Column.autoincrement参数定义的Column的规则,通常意味着不受外键约束的单个整数列主键约束中的列。如果表没有这样的主键约束,则没有“自动增量”列。...默认值为字符串"auto",表示应自动为具有整数类型且没有其他客户端或服务器端默认构造的单列(即非复合)主键接收自动递增语义。...当编译和执行单行insert()构造时,如果没有设置Insert.inline()修饰符,此列的新生成的主键值将在语句执行时自动通过特定于正在使用的数据库驱动程序的方法检索: MySQL,SQLite...Table 指定了额外的列或其他结构或修改表状态的标志,那么将引发错误。
同事问了个问题,MySQL 的某个测试库,发现有这种情况: 给已设置为主键的列又加了一次索引,如下前两条 SQL 语句。 给同一个字段加了 2 次索引,如下后两条 SQL 语句。...这种情况是不是没有意义? 这两个问题考察的都是关于索引的基础知识,如果对此很熟悉,答案不言自明,即使不熟悉,只需要做些简单的测试,就可以了解,加深印象。...因为这两个最主要的区别就是主键除了包含索引外,还需保证唯一,而此处的索引,就是普通索引,不是唯一索引,因此从逻辑上,这两个是不等价。...但是由于主键包含了索引,因此可以删除第二个索引,它属于重复的,主键的定义包含了索引的定义。...Oracle 19c,在主键字段上创建索引,会提示 此列列表已索引 的错误。在相同字段上创建第二个索引,也是提示 此列列表已索引 的错误。
一、列属性1、 主键主键(primary key):又叫主键约束,是表中的一个或多个字段,它的值用于唯一标识表中的某一条记录。...(字段名称,)---但不常用---删除主键alter table 表名 drop primary key;12345678主键的建立原则:主键应是对用户没有意义的不要更新主键主键不应包含动态变化的数据,...如时间戳等主键应由计算机自动生成一般来说就是id,特殊情况除外2、 唯一键唯一键(unique key):又叫唯一约束,其保证在一个字段或一组字段里的数据与表中其他行的数据相比是唯一的。...1特点:一张表中可以存在多个唯一键唯一键所在列中的数据不能重复唯一键允许该列数据为null,并且可以存在多个(但是不提倡)与主键的区别:主键唯一,唯一键不唯一,主键不为null,唯一键可为null---...drop index 唯一键名称;注意:与主键的删除略有不同1234567893、 自动增长自增长(auto increment):当对应的字段不给值或null的时候,系统会自动触发**从当前字段中已有的最大值执行
SELECT或WHERE列表中包含了子查询 DERIVED FROM列表中包含的子查询,即衍生 UNION UNION关键字之后的查询 UNION RESULT 从UNION后的表获取结果集 下面看看这些...const 通过一次索引就能找到数据,一般用于主键或唯一索引作为条件的查询sql中,执行sql如下: explain select * from test2 whereid=1; 结果: eq_ref...常用于主键或唯一索引扫描。...答:const只索引一次,而eq_ref主键和主键匹配,由于表中有多条数据,一般情况下要索引多次,才能全部匹配上。 ref 常用于非主键和唯一索引扫描。...请注意,此列完全独立于表的顺序,这就意味着possible_keys在实践中,某些键可能无法与生成的表顺序一起使用。 如果此列是NULL,则没有相关的索引。
:子查询的结果,其id值为N partitions列 该列的值表示查询将从中匹配记录的分区 type列 该列的值表示连接类型,是查看索引执行情况的一个重要指标。...const 通过一次索引就能找到数据,一般用于主键或唯一索引作为条件与常数比较的查询sql中,执行sql如下: explain select * from test2 where id=1; 结果:...eq_ref 常用于主键或唯一索引扫描,简单来说就是多表连接中使用主键或者唯一索引作为关联条件。...请注意,此列完全独立于表的顺序,这就意味着possible_keys在实践中,某些键可能无法与生成的表顺序一起使用。 如果此列是NULL,则没有相关的索引。...key_len列 该列表示使用索引的长度。上面的key列可以看出有没有使用索引,key_len列则可以更进一步看出索引使用是否充分。不出意外的话,它是最重要的列。
领取专属 10元无门槛券
手把手带您无忧上云