精华内容
下载资源
问答
  • 为指定数据的非空值建立唯一索引SQL Server 2008中,我们可以很方便的为指定数据的指定字段的所有非空值添加唯一性索引,以保证该字段的所有的非空值中都是唯一的。具体做法如下: 1: ...

    为指定数据表的非空值建立唯一性索引:

    在SQL Server 2008中,我们可以很方便的为指定数据表的指定字段的所有非空值添加唯一性索引,以保证该字段的所有的非空值在该表中都是唯一的。具体做法如下:

     

       1:  CREATE UNIQUE NONCLUSTERED INDEX un_ID_Invoice
       2:  ON FeeItem(ID_Invoice)
       3:  WHERE ID_Invoice is not null
       4:  GO

     

    在SQL Server中执行该语句,便会在FeeItem表中的ID_Invoice字段上添加非空唯一性索引,可以保证该表中的所有非空字段都是唯一的。

     

    存在问题:

    在该表中建立非空唯一性索引后,使用C#向该表中添加(INSERT)、删除(DELETE)、修改(UPDATE)数据时都会提示一个错误:

    DELETE 失败,因为下列 SET 选项的设置不正确:'ARITHABORT'。请确保 SET 选项可正确用于计算列和/或查询通知和/或 xml 数据类型方法的索引视图和/或索引。

     

    原因分析:

    我们查询MSDN,关于SET ARITHABORT的描述如下:

    查询执行过程中发生溢出或者除以零的错误时结束查询。…  当 SET ARITHABORT 是 OFF 的时候,如果INSERT、DELETE 或 UPDATE 表达式发现算术错误、溢出、除以零或者范围错误,SQL Server会插入或更新 NULL 值。如果目标行不可为NULL,插入或者更新操作就会失败而且使用者会收到错误信息。… 當您建立或變更計算資料行索引或索引檢視時,SET ARITHABORT 也必須是 ON。 如果 SET ARITHABORT 是 OFF,含計算資料行索引的資料表或索引檢視之 CREATE、UPDATE、INSERT 和 DELETE 陳述式會失敗。

     

     

    解决方案:

    1.你必须在TSQL前Set ARITHABORT ON,代码如下

       1:  Set ARITHABORT ON 
       2:  GO 
       3:  INSERT INTO ta ..
     

    2.在ADO中,你可以这样来写(C#代码)

     

       1:  MyConnection.Execute("SET ARITHABORT ON");
     

    如果以上你都觉得很麻烦或由于一些原因没法更改,你可以尝试修改SQL Server服务器选项

    3.

       1:  exec sp_dboption 'yourdb','ARITHABORT','true'
     

    或者

    4.

       1:  ALTER DATABASE yourdb  
       2:  SET ARITHABORT ON

    转载于:https://www.cnblogs.com/chaosimple/archive/2012/11/17/2775259.html

    展开全文
  • 深入理解四种数据库索引类型(- 唯一索引/非...1.唯一索引在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。 非唯一索引 2.非唯一索引在表上一个或者多个字段组合建立...

    深入理解四种数据库索引类型(- 唯一索引/非唯一索引 - 主键索引(主索引) - 聚集索引/非聚集索引 - 组合索引)

    • 唯一索引/非唯一索引
    • 主键索引(主索引)
    • 聚集索引/非聚集索引
    • 组合索引

    唯一索引/非唯一索引

    唯一索引

    1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。

    非唯一索引

    2.非唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,不要求唯一。

    主键索引(主索引)

    3.主键索引(主索引)是唯一索引的特定类型。表中创建主键时自动创建的索引 。一个表只能建立一个主索引。

    聚集索引/非聚集索引

    4.聚集索引(聚簇索引),表中记录的物理顺序与键值的索引顺序相同。一个表只能有一个聚集索引。

    扩展:聚集索引和非聚集索引的区别?分别在什么情况下使用?

    聚集索引和非聚集索引的根本区别是表中记录的物理顺序和索引的排列顺序是否一致。

    聚集索引的表中记录的物理顺序与索引的排列顺序一致

    优点是查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理的紧跟其后。

    缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。在插入新记录时数据文件为了维持 B+Tree 的特性而频繁的分裂调整,十分低效。

    建议使用聚集索引的场合为:
    A.某列包含了小数目的不同值。
    B.排序和范围查找。

    非聚集索引的记录的物理顺序和索引的顺序不一致

    其他方面的区别:
    1.聚集索引和非聚集索引都采用了 B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用中的记录在叶子层包含一个指向表数据页中的指针的方式。聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然是索引节点。

    2.非聚集索引添加记录时,不会引起数据顺序的重组。

    看上去聚簇索引的效率明显要低于非聚簇索引, 因为每次使用辅助索引检索都要经过两次 B+树查找, 这不是多此一举吗? 聚簇索引的优势在哪?

    1.由于行数据和叶子节点存储在一起, 这样主键和行数据是一起被载入内存的, 找到叶子节点就可以立刻将行数据返回了, 如果按照主键 Id 来组织数据, 获得数据更快。

    2.辅助索引使用主键作为"指针", 而不是使用地址值作为指针的好处是, 减少了当出现行移动或者数据页分裂时,辅助索引的维护工作, InnoDB 在移动行时无须更新辅助索引中的这个"指针"。 也就是说行的位置会随着数据库里数据的修改而发生变化, 使用聚簇索引就可以保证不管这个主键 B+树的节点如何变化, 辅助索引树都不受影响。

    建议使用非聚集索引的场合为:
    a.此列包含了大数目的不同值;
    b.频繁更新的列

    5.组合索引(联合索引)

    基于多个字段而创建的索引就称为组合索引。

    创建索引
    create index idx1 on table1(col1,col2,col3)
    查询
    select * from table1 where col1= A and col2= B and col3 = C
    

    组合索引查询的各种场景
    组合索引 Index (A, B, C)

    下面条件可以用上该组合索引查询:
     A>5
     A=5 AND B>6
     A=5 AND B=6 AND C=7
     A=5 AND B=6 AND C IN (2, 3)

    下面条件将不能用上组合索引查询:
     B>5 ——查询条件不包含组合索引首列字段
     B=6 AND C=7 ——理由同上

    下面条件将能用上部分组合索引查询(重要! ! ! ! ) :
     A>5 AND B=2 ——当范围查询使用第一列, 查询条件仅仅能使
    用第一列
     A=5 AND B>6 AND C=2 ——范围查询使用第二列, 查询条件仅仅能使用
    前二列
     A=5 AND B IN (2, 3) AND C=2 ——理由同上

    组合索引排序的各种场景:

    兹有组合索引 Index(A,B)。
     下面条件可以用上组合索引排序:
     ORDER BY A——首列排序
     A=5 ORDER BY B——第一列过滤后第二列排序
     ORDER BY A DESC, B DESC——注意, 此时两列以相同顺序排序
     A>5 ORDER BY A——数据检索和排序都在第一列

    下面条件不能用上组合索引排序:
     ORDER BY B ——排序在索引的第二列
     A>5 ORDER BY B ——范围查询在第一列, 排序在第二列
     A IN(1,2) ORDER BY B ——理由同上
     ORDER BY A ASC, B DESC ——注意, 此时两列以不同顺序排序

    alter table users add index lname_fname_age(lname,fname,age);
    

    创建了 lname_fname_age 多列索引,相当于创建了(lname)单列索引,
    (lname,fname)联合索引以及(lname,fname,age)联合索引。

    举例说明:上面给出一个多列索引(username,password,last_login),当
    三 列 在 where 中 出 现 的 顺 序 如 (username,password,last_login) 、
    (username,password)、(username)才能用到索引,如下面几个顺序
    (password,last_login) 、 (passwrod) 、 (last_login)--- 这 三 者 不 从
    username 开始,(username,last_login)---断层,少了 password,都无
    法利用到索引。因为 B+tree 多列索引保存的顺序是按照索引创建的顺序,
    检索索引时按照此顺序检索。



    作者:六尺帐篷
    链接:https://www.jianshu.com/p/f49ee80c4956
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 唯一索引/非唯一索引 主键索引(主索引) 聚集索引/非聚集索引 ...唯一索引/非唯一索引 ...唯一索引 ...1.唯一索引在表上一个或者多个字段组合...2.非唯一索引在表上一个或者多个字段组合建立的索引,这个或者这...

    原文链接:https://www.jianshu.com/p/f49ee80c4956

    • 唯一索引/非唯一索引
    • 主键索引(主索引)
    • 聚集索引/非聚集索引
    • 组合索引

    唯一索引/非唯一索引

    唯一索引

    1.唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。

    非唯一索引

    2.非唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,不要求唯一。

    主键索引(主索引)

    3.主键索引(主索引)是唯一索引的特定类型。表中创建主键时自动创建的索引 。一个表只能建立一个主索引。

    聚集索引/非聚集索引

    4.聚集索引(聚簇索引),表中记录的物理顺序与键值的索引顺序相同。一个表只能有一个聚集索引。

    扩展:聚集索引和非聚集索引的区别?分别在什么情况下使用?

    聚集索引和非聚集索引的根本区别是表中记录的物理顺序和索引的排列顺序是否一致。

    聚集索引的表中记录的物理顺序与索引的排列顺序一致

    优点是查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理的紧跟其后。

    缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。在插入新记录时数据文件为了维持 B+Tree 的特性而频繁的分裂调整,十分低效。

    建议使用聚集索引的场合为:
    A.某列包含了小数目的不同值。
    B.排序和范围查找。

    非聚集索引的记录的物理顺序和索引的顺序不一致

    其他方面的区别:
    1.聚集索引和非聚集索引都采用了 B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然是索引节点。

    2.非聚集索引添加记录时,不会引起数据顺序的重组。

    看上去聚簇索引的效率明显要低于非聚簇索引, 因为每次使用辅助索引检索都要经过两次 B+树查找, 这不是多此一举吗? 聚簇索引的优势在哪?

    1.由于行数据和叶子节点存储在一起, 这样主键和行数据是一起被载入内存的, 找到叶子节点就可以立刻将行数据返回了, 如果按照主键 Id 来组织数据, 获得数据更快。

    2.辅助索引使用主键作为"指针", 而不是使用地址值作为指针的好处是, 减少了当出现行移动或者数据页分裂时,辅助索引的维护工作, InnoDB 在移动行时无须更新辅助索引中的这个"指针"。 也就是说行的位置会随着数据库里数据的修改而发生变化, 使用聚簇索引就可以保证不管这个主键 B+树的节点如何变化, 辅助索引树都不受影响。

    建议使用非聚集索引的场合为:
    a.此列包含了大数目的不同值;
    b.频繁更新的列

    5.组合索引(联合索引)

    基于多个字段而创建的索引就称为组合索引。

    创建索引
    create index idx1 on table1(col1,col2,col3)
    查询
    select * from table1 where col1= A and col2= B and col3 = C

    组合索引查询的各种场景
    组合索引 Index (A, B, C)

    下面条件可以用上该组合索引查询:
     A>5
     A=5 AND B>6
     A=5 AND B=6 AND C=7
     A=5 AND B=6 AND C IN (2, 3)

    下面条件将不能用上组合索引查询:
     B>5 ——查询条件不包含组合索引首列字段
     B=6 AND C=7 ——理由同上

    下面条件将能用上部分组合索引查询(重要! ! ! ! ) :
     A>5 AND B=2 ——当范围查询使用第一列, 查询条件仅仅能使
    用第一列
     A=5 AND B>6 AND C=2 ——范围查询使用第二列, 查询条件仅仅能使用
    前二列
     A=5 AND B IN (2, 3) AND C=2 ——理由同上

    组合索引排序的各种场景:

    兹有组合索引 Index(A,B)。
     下面条件可以用上组合索引排序:
     ORDER BY A——首列排序
     A=5 ORDER BY B——第一列过滤后第二列排序
     ORDER BY A DESC, B DESC——注意, 此时两列以相同顺序排序
     A>5 ORDER BY A——数据检索和排序都在第一列

    下面条件不能用上组合索引排序:
     ORDER BY B ——排序在索引的第二列
     A>5 ORDER BY B ——范围查询在第一列, 排序在第二列
     A IN(1,2) ORDER BY B ——理由同上
     ORDER BY A ASC, B DESC ——注意, 此时两列以不同顺序排序

    alter table users add index lname_fname_age(lname,fname,age);

    创建了 lname_fname_age 多列索引,相当于创建了(lname)单列索引,
    (lname,fname)联合索引以及(lname,fname,age)联合索引。

    举例说明:上面给出一个多列索引(username,password,last_login),当
    三 列 在 where 中 出 现 的 顺 序 如 (username,password,last_login) 、
    (username,password)、(username)才能用到索引,如下面几个顺序
    (password,last_login) 、 (passwrod) 、 (last_login)--- 这 三 者 不 从
    username 开始,(username,last_login)---断层,少了 password,都无
    法利用到索引。因为 B+tree 多列索引保存的顺序是按照索引创建的顺序,
    检索索引时按照此顺序检索。

    转载于:https://www.cnblogs.com/wangbb13/articles/8286899.html

    展开全文
  • MySQL 索引 MySQL索引建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,...实际索引也是一张,该保存了主键与索引...

    MySQL 索引

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
    索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不
    是组合索引。组合索引,即一个索引包含多个列。
    创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
    实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大
    提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表
    时,MySQL不仅要保存数据,还要保存一下索引文件。
    建立索引会占用磁盘空间的索引文件。

    普通索引

    创建索引

    这是最基本的索引,它没有任何限制。它有以下几种创建方式:

    CREATE INDEX indexName ON mytable(username(length)); 
    //创建索引 
    create index id on B(A_ID); 

    如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 
    length。

    修改表结构(添加索引) 

    ALTER table tableName ADD INDEX indexName(columnName) 

    创建表的时候直接指定

    CREATE TABLE mytable(
    ID INT NOT NULL,
    username VARCHAR(16) NOT NULL,
    INDEX [indexName] (username(length))
    );

    删除索引的语法

    DROP INDEX [indexName] ON mytable;

    唯一索引

    它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值
    的组合必须唯一。它有以下几种创建方式:

    创建索引

    CREATE UNIQUE INDEX indexName ON mytable(username(length))

    修改表结构

    ALTER table mytable ADD UNIQUE [indexName] (username(length))

    创建表的时候直接指定

    CREATE TABLE mytable(
    ID INT NOT NULL,
    username VARCHAR(16) NOT NULL,
    UNIQUE [indexName] (username(length))
    );

    使用ALTER 命令添加和删除索引 

    有四种方式来添加数据表的索引: 
    ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引
    值必须是唯一的,且不能为NULL。
    ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须
    是唯一的(除了NULL外,NULL可能会出现多次)。
    ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现
    多次。
    ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 
    FULLTEXT ,用于全文索引。
    以下实例为在表中添加索引。

    mysql> ALTER TABLE testalter_tbl ADD INDEX (c); 

    你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:

    mysql> ALTER TABLE testalter_tbl DROP INDEX c;

    使用 ALTER 命令添加和删除主键

    主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:

    mysql> ALTER TABLE testalter_tbl MODIFY itcast INT NOT NULL;
    mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (test);

    你也可以使用 ALTER 命令删除主键:

    mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

    删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。

    显示索引信息

    你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。
    尝试以下实例:

    mysql> SHOW INDEX FROM table_name; \G
    mysql> show index from B;
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------------
    ---+---------------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality |
    Sub_part | Packed | Null | Index_type | Comment | Index_comment |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------------
    ---+---------------+
    | B | 0 | PRIMARY | 1 | A_ID | A | 3 | NULL | NULL | | BTREE
    | | |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------------
    ---+---------------+

     

    展开全文
  • 数据库索引就象书的目录一样,如果字段上建立索引,那么以索引列为查询条件时可以加快查询数据的速度。查询数据库,按主键查询是最快的,每个只能有一个主键列,但是可以有多个普通索引列,主键列要求列的所有...
  •  索引就像书的目录一样,如果字段上建立索引,那么以索引列为查询条件时可以加快查询速度,这是mysql优化的重要内容之一,后面课程会详细讲到  1、创建主键索引  查询数据库,按主键查询时最快的,每个...
  • 数据库建立索引

    2018-08-22 23:07:29
    建立索引: 目的:加快查询速度 create [unique] [cluster] index <索引名> on &...索引可以建立在的一列或多列,各列名之间用逗号隔开,次序表示索引值的排列次序,...
  • 唯一索引:索引的每一个索引值只对应唯一的索引记录。 建立索引的几种方法: 1. 利用SSMS创建索引 2.利用SQL语句中的CREATE INDEX命令创建索引。 3.还可以创建的PRIMARY KEY 或UNIQUE 约束时自动创建索引...
  • 索引的几种类型: 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 ...唯一索引: ...是一种特殊的唯一索引主键上建立,其他的索引都是基于主键索引,mysql默认创建时建立主键索引。 组合索..
  • 数据库-数据库索引

    2020-03-12 19:10:46
    数据库索引数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。...数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)创...
  • 数据库索引

    2020-08-19 23:51:01
    用户可以根据应用环境的需要基本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。关系数据库系统执行查询操作时会自动选择合适的索引作为存取路径,用户不必也不能显示的选择索引。 2、索引的类型 ...
  • 数据库建立索引的优缺点

    千次阅读 2019-04-01 14:21:34
    索引就像是书的目录,是与或视图关联的磁盘结构,可以加快从或视图中检索行的速度。索引中包含由或视图中的一列或多列生成的键。这些键存储一个结构(BTree)中,使SQL可以快速有效地查找与键值关联的行。...
  • 数据库建立索引规则

    2010-10-11 12:03:00
    设定数据量行数值为rows,属性...c,不考虑该列创建索引 例如:status、flag、type、content等性质的属性列不创建索引 规则3、 unique_c/rows=1的属性列创建唯一索引。 规则4
  • 前言 前面两篇文章 《解析B+树比B树更加适合做数据库索引的原因 》 和《从底层解析B+索引提高查询速度的原因》是从数据结构的角度...2、作为主键的列上建立索引,强制该列的唯一性和组织中数据的排列结构; 3、
  • 所以数据库索引也是这个作用,通过在表的一列或多个列上建立索引对象,用于加快数据的检索。 (一)索引的类型 唯一索引 索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 主键索引 ...
  • SQL 如何建立索引来加快数据库的查询

    千次阅读 多人点赞 2020-04-02 18:35:25
    文章目录1. 什么是索引2. 索引的特点3. 索引的分类3.1. 普通索引3.2. 唯一索引(unique)3.3. 主键索引(primary key)3.4. 单列索引3.5. 组合索引3.6. 全文索引(fulltext)3.7.... 已经存在的表上...
  • 数据库索引

    千次阅读 2020-05-14 00:01:50
    通过创建唯一索引,可以保证数据库表中每一行数据的唯一性; 使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间; 索引的坏处? 创建索引和维护索引要耗费时间,而且时间随着数据量的增加而...
  • 什么情况下会用到索引:只有经常查询某字段中的数据时,才需要在表的字段上建立索引 索引的类型:普通索引、唯一索引、聚焦索引、主键索引、全文索引 数据库索引底层实现: 数据库的底层索引是用B树和B+树实现的...
  • 删除重复数据,建立唯一索引

    千次阅读 2017-03-02 15:55:53
    一开始数据库中未建立唯一索引,但是业务逻辑是有唯一性约束的。运行一段时间后,才发现这个问题,记录一下 对应的T_ROUTE_ORBIT,唯一限制字段: longitude, latitude, task_id 删除重复记录,...
  • 数据库索引——Mysql

    2021-03-02 19:13:41
    一:索引:索引是一个单独的、存储磁盘上的数据库结构,它们包含着对...4:条件表达式中经常用到的不同值较多的列上建立检索,不同值少的列上不要建立索引。 5:当唯一性是某种数据本身的特征时,指定唯一索引
  • DM数据库-索引管理

    2020-07-29 17:10:50
    管理索引的准则 索引是与表相关的可选的结构(聚集索引除外),它能使对应于表的SQL语句执行得更快,创建了索引可以更快地定位信息... 全文索引在表的文本列上建立索引。 创建索引 明确地创建索引 ..
  • 数据库的几种索引

    2019-12-30 22:42:04
    ②唯一索引:建立主键或者唯一约束时会自动对应的列上建立唯一索引 (2)索引列的个数:单列索引和复合索引 (3)按照索引列的物理组织方式 ①B树索引 create index 索引名 on 表名(列名) tablespace ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 443
精华内容 177
关键字:

数据库在表上建立唯一索引