精华内容
下载资源
问答
  • 在mysql 的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既相等,也不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该违反.....

    唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。

    在mysql 的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该不违反唯一约束,所以是合理的。A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. For all engines, a UNIQUE index allows multiple NULL values for columns that can contain NULL.

    项目中需要用到联合唯一索引: 例如:有以下需求:每个人每一天只有可能产生一条记录:处了程序约定之外,数据库本身也可以设定: 例如:user表中有userID,userName两个字段,如果不希望有2条一模一样的记录,需要给user表添加多个字段的联合唯一索引: alter table user add nuique index(user_id,user_name); 例如: alter table user_daily_money_info add unique index agd(user_account_id,game_id,daily_date); alter table user_daily_money_info add unique key agdkey(user_account_id,game_id,daily_date); 这样如果向表中添加相同记录的时候,会返回一下错误信息: 2还有一种情况就是,我们需要为以前的表 创建这个索引,有可能以前的数据中存在重复的记录 那怎么办呢? alter ignore table user add unique index(user_id,user_name);它会删除重复的记录(别怕,会保留一条),然后建立唯一索引,高效而且人性化.

    查询时使用联合索引的一个字段,如果这个字段在联合索引中所有字段的第一个,那就会用到索引,否则就无法使用到索引。 例如联合索引 IDX(字段A,字段B,字段C,字段D),当仅使用字段A查询时,索引IDX就会使用到;如果仅使用字段B或字段C或字段D查询,则索引IDX都不会用到。

    这个规则在oracle和mysql数据库中均成立。

    展开全文
  • 主键、约束和索引

    2019-09-28 12:12:17
    1、主键约束不允许出现 NULL 值。任何索引条目的索引键都不允许包含NULL。唯一约束允许包含 NULL 值,但唯一约束把两个 NULL 值当作重复值,所以施加了唯一约束的每一列只允许包含一个 NULL 值。 2、创建主键时会...

    1、主键约束不允许出现 NULL 值。任何索引条目的索引键都不允许包含NULL。唯一约束允许包含 NULL 值,但唯一约束把两个 NULL 值当作重复值,所以施加了唯一约束的每一列只允许包含一个 NULL 值。
    2、创建主键时会自动创建聚集索引,除非当前表中已经含有了聚集索引或是创建主键时指定了 NONCLUSTERED 关键字。
    3、创建唯一约束时会自动创建非聚集索引,除非你指定了 CLUSTERED 关键字并且当前表中还没有聚集索引。
    4、每个表中只能有一个主键,但可以有多个唯一约束。

    --创建唯一约束
    ALTER TABLE tablename ADD CONSTRAINT u_store UNIQUE NONCLUSTERED(username)
    --创建唯一索引
    CREATE UNIQUE NONCLUSTERED INDEX [AK_Product_Name] ON Production.Product([Name])

    以数据完整性为目标的话,最好创建约束,这使得对应的索引的目标一目了然
    --自增列插入失败,id依旧会增加
    --无法更新标识列

    CREATE TABLE test_ident(id INT IDENTITY,NAME VARCHAR(50))
    ALTER TABLE test_ident ALTER COLUMN NAME VARCHAR(10)
    --制造错误
    INSERT INTO test_ident 
    SELECT top 10 name FROM sys.objects o WHERE TYPE='U' 
    and LEN(name)>10
    --正常插入
    INSERT INTO test_ident 
    SELECT top 10 name FROM sys.objects o WHERE TYPE='U' 
    and LEN(name)<=10
    --查看数据
    SELECT * FROM test_ident
    
    --自增列插入失败,id依旧会增加
    --无法更新标识列
    UPDATE test_ident SET id = 1
    WHERE id=2
    
    --clear up
    DROP TABLE test_ident
    View Code

    对于非聚集索引,如果我们把非聚集索引的叶节点看成一张表的数据页,那就可以把非聚集索引过渡看成是“聚集索引”,只不过这个“聚集索引”的数据页存放的是索引列,包含列、书签等。如果我们要查询的字段包含在索引列、包含列,那就直接返回结果,否则就得通过书签跳转到底层数据表去查找。

    转载于:https://www.cnblogs.com/Uest/p/5230130.html

    展开全文
  • 唯一约束认为索引键上的NULL值是相等不允许重复的NULL值出现索引键或其组合。 1,主键约束创建唯一索引 作为Primay Key约束列必须是唯一,非空,SQL Server在创建主键约束时,自动为主键列创建一个唯一...

    主键约束和唯一约束都会创建唯一索引,不同之处在于主键约束的索引键在定义上不允许为NULL,而唯一约束的索引键在定义上允许为NULL;唯一约束认为索引键上的NULL值是相等的,不允许重复的NULL值出现在索引键或其组合。

    1,主键约束创建唯一索引

    作为Primay Key约束的列必须是唯一的,非空的,SQL Server在创建主键约束时,自动为主键列创建一个唯一索引,并且索引列不允许为null;

    主键约束创建的唯一索引,可以是聚集索引(clustered),也可以是非聚集索引(nonclustered);

    id int not null primary key nonclustered ,
    id int not null primary key clustered ,
    

    2,唯一约束创建唯一索引

    在关系表中,唯一约束的列是唯一的,但是可以为Null;在唯一性约束中,null值是相等的。如果唯一性约束的列是单列,那么只有一行数据列能够为null;如果唯一性约束的列是多列,那么列的任意一种组合,不能相同。

    SQL Server 在创建唯一性约束时,会自动创建一个唯一索引,通过clustered 或 nonclustered来指定创建的索引是聚集索引,还是非聚集索引;

    id int unique nonclustered,
    id int unique clustered,

    3,唯一性约束和主键约束的区别

    • 唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值;
    • 可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的,但是,唯一性约束所在的列并不是表的主键列;
    • 唯一性约束强制在指定的列上创建一个唯一性索引。在默认情况下,创建唯一性的非聚簇索引,但是,也可以指定所创建的索引是聚簇索引。
    • 一个表上只能有一个主键约束,但是可以有多个唯一性约束。

    4,创建唯一索引

    使用create unique index命令创建唯一索引

    create unique nonclustered index idx_unique_id 
    on dbo.test(id)
    create unique clustered index cidx_unique_id
    on dbo.test(id)

    5,删除主键约束和唯一性约束自动创建的唯一索引

    由于唯一索引是由主键约束或唯一性约束自动创建的,因此,必须删除约束,才能删除索引。

    alter table dbo.table
    drop constraint [PK__constraint_name]
    
    alter table dbo.table
    drop constraint [UQ__constraint_name]
    
    展开全文
  • 普通索引(非唯一索引):唯一索引:要求键值不能重复(但是可以有多个NULL值)主键索引:是特殊唯一索引不允许键值为NULL全文索引:针对较大文本类型数据,提升like语句查询效率唯一索引和普通索引:Change ...

    普通索引(非唯一索引):

    唯一索引:要求键值不能重复(但是可以有多个NULL值)

    主键索引:是特殊的唯一索引,不允许键值为NULL

    全文索引:针对较大的文本类型数据,提升like语句的查询效率

    唯一索引和普通索引:Change Buffer对普通索引的插入操作进行了优化,从而有更快的插入速度,但是阿里规约中:唯一索引优于普通索引(强制)

    索引模型

    B-tree(多路平衡查找树)

    关键字只出现一次(非叶子节点也存储数据)

    搜索性能等于关键字全集内做一次二分查找

    自动层次控制:页分裂和页合并

    cff7a84ccdd781f1195e7589e2435382.png

    B+tree (增强的多路平衡查找树)

    非叶子节点都是冗余的关键字索引数据,所有关键字和数据均存储在叶子节点

    相较于B-tree,B+tree的非叶子节点存储的关键字数更多(路数更多),树的层级更少(因此能有效减少磁盘IO)

    B+tree所有叶子节点构成了一个有序链表,在范围查找时效率更高(全表遍历也更快)

    B+tree的查询效率更稳定(查询均需抵达叶子节点)

    e4027604594b0ec2937bc68339e50fdd.png

    自适应Hash(Adaptive Hash Index)

    Hash的时间复杂度时O(1),只能用于等值查询,不能用于范围查询

    Hash冲突时采用拉链法解决

    innoDB中只存在自适应hash,由引擎自行维护,存储在缓冲池中,作为热点数据的优化机制。

    (show variables like 'innodb_adaptive_hash_index'; 默认值 ON)

    MyISAM和InnoDB的数据结构实现

    MyISAM(非聚簇索引 + 叶子节点存储磁盘地址 + 数据文件)

    0ceebaed151679150af6188a5bb79ff0.png

    InnoDB(聚簇索引 + 叶子节点存储数据值 --- 非聚簇索引存储主键)

    6c51125ad2ca6c4e51ddd5d391d5c833.png

    InnoDB必有主键索引:

    如果已定义主键,则直接选择主键作为主键索引

    如果不存在主键,则使用不带有NULL值的唯一索引作为主键索引

    如果也不存在不带NULL值的唯一索引,则选择内置的6字节长的ROWID作为主键索引(递增,不可被选用 < 此为与Oracle InnoDB的不同)

    InnoDB建议使用递增的主键

    递增的主键,在插入时近似顺序写入,会有更高的效率。

    数据页到达阈值时只需要分配新的页,不会导致页分裂,索引也更易于维护

    缺点:在高并发工作负载时,可能导致间隙锁竞争,调优参数:innodb_autoinc_lock_mode

    回表: 在辅助索引中一次查询到主键的值后,再次回到主键索引查找数据的过程叫回表

    索引使用原则

    联合索引最左匹配原则

    PS:单列索引,亦有最左匹配原则:"LIKE %abc" 类型的查询无法使用索引

    对于多列索引,如CREATE INDEX idx_name_phone on tb_user(name,phone);

    只有存在(对name的查询)或(同时对name和phone的查询)时索引生效

    对于联合索引(A,B,C),对于查找类型(A)和查找类型(A,B)均可生效

    覆盖索引 (EXPLAIN:Using index)`:

    如果辅助索引中包含了查询所需要的所有信息,则可以从辅助索引中直接获得结果集,无须回表

    索引条件下推(ICP)

    set optimizer_switch = 'index_condition_pushdown=on';

    不使用索引条件下推优化时的查询过程:

    获取下一行,首先读取索引信息,然后根据索引将整行数据读取出来。

    然后通过where条件判断当前数据是否符合条件,符合返回数据。

    使用索引条件下推优化时的查询过程(EXPLAIN:Using index condition):

    获取下一行的索引信息。

    检查索引中存储的列信息是否符合索引条件,如果符合将整行数据读取出来,如果不符合跳过读取下一行。

    用剩余的判断条件,判断此行数据是否符合要求,符合要求返回数据。

    索引的比较是在存储引擎进行的,数据记录的比较,是在Server层进行的

    索引的创建与使用

    索引创建

    散列度:索引应建立在散列度较高的属性列上

    使用递增的id作为主键索引,尽量与业务无关(类顺序写入,优化IO,避免页分裂)

    建立索引的属性列不应频繁更新(避免页分裂和索引维护)

    建立组合索引,并把散列度高的值放在前面

    在用于where判断/order排序/join(on)的字段上创建索引

    对于长度较长的字段,应该选取合适的长度作为索引

    SELECT count(distinct LEFT(field, prefix_size))/count(*) from table

    索引(未生效情况)

    索引列上使用函数、表达式、算符:a + 1 = 2 或 count(a,b) = 'kiqi'

    字符串不加引号,出现隐式转换

    未满足最左前缀匹配原则 LIKE "%kiqi" 或未满足联合索引最左匹配原则

    or语句前后没有同时使用索引:当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效

    部分负向查询:不能(NOT LIKE),部分情况可以(!=、<>)

    索引的使用规则:基于开销(cost),而非规则或语义,即:当全文查询开销小于使用索引时,则有可能不采用索引。

    展开全文
  • 普通索引:允许重复值的出现 唯一索引:除了能有重复的纪录外,其他普通索引一样(用户id,身份证,email,tel) 主键索引:是随着设定主键而创建的,也就是把某个列设定为主键的时候就会给该列创建索引,这就是...
  • 唯一约束认为索引键上的NULL值是等待不允许重复的NULL值出现索引键或其组合。 1,主键约束创建唯一索引 作为Primay Key约束列必须是唯一,非空,SQL Server在创建主键约束时,自动为主键列创建...
  • mysql中索引的分类:

    2018-03-16 15:50:31
    普通索引允许重复的值出现,可以再任何字段上面添加唯一索引:除了能有重复的记录外,其它普通索引一样,可以在是唯一字段添加(用户名、手机号码、身份证、email,QQ),可以为null,并且可以有多个null...
  • 普通索引: 允许重复的值出现; 唯一索引: 除了能有重复的记录外,其它普通索引一样(用户名、用户身份证、email、tel); 主键索引:是随着设定主键而创建,也就是把某个列设为主键时候,数据库就会給改列创建...
  • Mysql 索引 简介

    2020-05-19 08:29:16
    哈希索引 :时间复杂度o1 哈希索引是无序 不能用来排序范围查询,并且不允许表里有太多重复值出现,避免哈希冲突。 B+Tree:扫库,扫表能力更强,排序能力强,磁盘读写能力强,效率更加稳定。Innodb 只有主键是...
  • MySQL实例组件使用注意事项 MySQL 实例不支持创建外键。 时间戳类型字段取值范围为... 复合唯一索引仅支持所有字段 null 值重复,不允许部分字段 null 值重复,例如:允许出现(null,null)(null,null)重复值
  • List接口使用

    2021-05-05 14:04:53
    List 允许出现重复的值。 实现 List 接口常用类有 ArrayList LinkedList。它们都可以容纳所有类型对象,包括 null 。 允许重复,并且可保证元素存储顺序。 二、ArrayList 类 ArrayList 支持可随需要而...
  • List允许出现重复的值。实现List接口常用类有ArrayListLinkedList。他们都可以容纳所有类型对象,包括null。允许重复,并且可保证元素存入顺序。 ArrayList:ArrayList支持可随需要而增长动态数组。在Java...
  • 虽然唯一约束不允许出现重复的值,但是可以为多个null 同一个表可以有多个唯一约束,多个列组合约束。在创建唯一约束时候,如果不给唯一约束名称,就默认列名相同。 唯一约束不仅可以在一个表内创建,而且可以...
  • 如果设置为 FALSE, 将执行 PL/SQL V3 行为, 而不允许 V2 行为; 否则在运行 PL/SQL V3 时将接受某些 PL/SQL V2 行为。 范围: TRUE | FALSE 默认值: FALSE plsql_native_make_utility: 说明: 指定 make 实用程序 ...
  • 完整性约束

    2020-09-03 16:19:18
    数据库完整性是指保护数据库有效性正确性,防止数据库中存在符合语义、...唯一键值可以是NULL,但只允许出现一个NULL值 主键约束(primary key):在数据库中通常用一个字段或几个字段组合值来唯一标识表
  • HashMap允许将null作为一个entrykey或者value,而Hashtable不允许。 HashMap把Hashtablecontains方法去掉了,改成containsvaluecontainsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary...
  • <code>currentIndex,可选,数组中正在处理的当前元素的索引,如果提供了initialValue,则起始索引号为0,否则为1;<code>arr,可选,当前元素所属的数组对象。<code>initialValue</code>,可选&...
  • 一、ORACLE启动关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup SVRMGR>quit b、关闭...
  • 不允许出现任何魔法(即未经预先定义常量)直接出现在代码中。 B .魔法是指程序中随意定义并赋值变量,如果代码编写者明白变量意义是可以任意使用,例如在代码中写if(status == 3) return error;...
  •  删除环境变量中PATHT CLASSPATH中包含Oracle的值。  删除“开始”/“程序”中所有Oracle图标。  删除所有与Oracle相关目录,包括: C:\Program file\Oracle目录。 ORACLE_BASE目录。 C:\Documents ...
  • SQL 优化原则

    2013-10-29 15:28:36
     能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。 ...
  • 2009达内SQL学习笔记

    2010-02-10 19:46:58
    (NULL表示包含。与空格、0是不同。) 如:SELECT prod_name,prod_price FROM Products WHERE prod_price IS NULL; 七、高级检索(逻辑运算符): 通常我们需要根据多个条件检索数据。可以使用AND或OR、NOT等...
  • java 面试题 总结

    2009-09-16 08:45:34
    HashMap允许将null作为一个entrykey或者value,而Hashtable不允许。 HashMap把Hashtablecontains方法去掉了,改成containsvaluecontainsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    26.javaawtswing组件GUI设计关键 27.对于java流认识 28.简单描述一下awt与swing区别。 29.简述java编程中事件处理模式。 30.你编写过applet吗?applet安全权限如何?试列举java application或者...
  • SQL语法大全

    2014-03-30 11:00:11
    COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个表格栏最小的值 SUM(字段名) 把数据栏的值相加 引用以上函数的方法: sql="select sum...
  • orcale常用命令

    2009-08-04 00:34:59
    依此类推,就可以轻松知道数据字典详细名称解释,不用查看ORACLE其它文档资料了。 下面按类别列出一些ORACLE用户常用数据字典查询使用方法。 1、用户 查看当前用户缺省表空间 SQL>select username...
  • •Java语言的数组索引是从0开始的,也就是说,第一个数组元素的索引值为0,最后一个数组元素的索引为数组长度 减1。 •如果访问数组元素进指定的索引小于0,或者大于等于数组的长度,编译程序不会出现任何错误...

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

不允许出现重复值和null值的索引