当前位置:首页 » 编程语言 » 数据库唯一索引sql
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

数据库唯一索引sql

发布时间: 2023-08-19 13:55:50

数据库基础详解:存储过程、视图、游标、sql语句优化以及索引

写在文章前:本系列文章用于博主自己归纳复习一些基础知识,同时也分享给可能需要的人,因为水平有限,肯定存在诸多不足以及技术性错误,请大佬们及时指正。

存储过程 是事先经过编译并存储在数据库中的一段SQL语句的集合。想要实现相应的功能时,只需要调用这个存储过程就行了(类似于函数,输入具有输出参数)。

优点

缺点

Delete用来删除表的全部或者部分数据,执行delete之后,用户需要提交之后才会执行,会触发表上的DELETE触发器(包含一个OLD的虚拟表,可以只读访问被删除的数据),DELETE之后表结构还在,删除很慢,一行一行地删,因为会记录日志,可以利用日志还原数据;

Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器。操作比DELETE快很多(直接把表drop掉,再创建一个新表,删除的数据不能找回)。如果表中有自增(AUTO_INCREMENT)列,则重置为1。

Drop命令从数据库中删除表,所有的数据行,索引和约束都会被删除。不能回滚,不会触发触发器。

触发器(TRIGGER)是由事件(比如INSERT/UPDATE/DELETE)来触发运行的操作(不能被直接调用,不能接收参数)。在数据库里以独立的对象存储,用于保证数据完整性(比如可以检验或转换数据)。

约束(Constraint)类型:

从数据库的基本表中通过查询选取出来的数据组成的虚拟表(数据库中只存放视图的定义,而不存放视图的数据)。可以对其进行增/删/改/查等操作。视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变)。

可以跟基本表一样,进行增删改查操作( 增删改操作有条件限制,一般视图只允许查询操作 ),对视图的增删改也会影响原表的数据。 它就像一个窗口,透过它可以看到数据库中自己感兴趣的数据并且操作它们。 好处:

用于定位在查询返回的结果集的特定行,以对特定行进行操作。使用游标可以方便地对结果集进行移动遍历,根据需要滚动或对浏览/修改任意行中的数据。主要用于交互式应用。它是一段私有的SQL工作区,也就是一段内存区域,用于暂时存放受SQL语句影响的数据,简单来说,就是将受影响的数据暂时放到了一个内存区域的虚表当中,这个虚表就是游标。

游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。即游标用来逐行读取结果集。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。

游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。通俗来说,游标就是能在sql的查询结果中,显示某一行(或某多行)数据,其查询的结果不是数据表,而是已经查询出来的结果集。

简单来说:游标就是在查询出的结果集中进行选择性操作的工具。

缓存更高效。对于连接查询,如果其中一个表发生变化,那么整个查询缓存就无法使用。而分解后的多个查询,即使其中一个表发生变化,对其它表的查询缓存依然可以使用。分解成多个单表查询,这些单表查询的缓存结果更可能被其它查询使用到,从而减少冗余的查询。减少锁竞争。

索引是对数据库表中一列或多列的值进行排序的一种结构(说明是在列上建立的),使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。

当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作。第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止。有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。

从应用上分, 主键索引(聚集) 唯一索引(聚集/非聚集) 普通索引 组合索引 单列索引和全文索引

❷ 创建唯一索引的 sql语句

sql语句创建唯一索引的方法:
1、在sql server数据库中:
CREATE UNIQUE INDEX AK_UnitMeasure_Name
ON Proction.UnitMeasure (Name);
GO

2、在oracle中床创建
CREATE unique INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空间名;

❸ SQL Server唯一索引和非唯一索引的区别简析

SQL Server创建索引时,可以指定Unique使之成为唯一索引。“唯一”顾名思义,但是两都到底有什么区别呢?因为索引也是一种物理结构,所以还是要从存储和结构上分析。

索引结构分叶级和非叶级,分析时我们要分开来看,这个很重要。

文中涉及的索引行大小计算,参考MSDN估计数据库大小索引部分。

1. 非唯一聚集索引和唯一聚集索引

创建两个测试表,各10000条整数,tb1唯一,tb2非唯一,有1000条为9999的重复值。

view sourceprint?

01.<img onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_402704').style.display='none'; document.getElementById('Code_Open_Image_402704').style.display='inline'; document.getElementById('Code_Open_Text_402704').style.display='inline';"id="Code_Closed_Image_402704"align="top"src=""width="11"height="16"style="display: none;"><img alt="加载中..."title="图片加载中..."src="http://www.it165.net/statics/images/s_nopic.gif"><img onclick="this.style.display='none'; document.getElementById('Code_Open_Text_402704').style.display='none'; getElementById('Code_Closed_Image_402704').style.display='inline'; getElementById('Code_Closed_Text_402704').style.display='inline';"id="Code_Open_Image_402704"style="display: none;"align="top"src=""width="11"height="16"><img alt="加载中..."title="图片加载中..."src="http://www.it165.net/statics/images/s_nopic.gif">Codecreate table tb1

02.(col1int);

03.declare@iint=1

04.while@i<10001

05.begin

06.insert into tb1 values(@i);

07.set@i=@i+1;

08.end;

09.create unique clustered index ucix on tb1 (col1)

10.go

11.-------

12.create table tb2

13.(col2int);

14.declare@iint=1

15.while@i<9001

16.begin

17.insert into tb2 values(@i);

18.set@i=@i+1;

19.end;

20.go

21.insert into tb2 values(9999)

22.go1000;

23.create clustered index cix on tb2 (col2)

24.go

先查询索引的一些基本状况:

发现多出一个UNIQUIFIER,同样叶级也是一样。MSDN说明:

“如果聚集索引不是唯一的索引,SQL Server 将添加在内部生成的值(称为唯一值)以使所有重复键唯一。此四字节的值对于用户不可见。仅当需要使聚集键唯一以用于非聚集索引中时,才添加该值。”

还有UNIQUIFIER不是一个全局自增列,重复记录增加时此值会发生改变,并且它是一个可为null的变长列。

现在来算一算索引行大小:

两个表都是只有一个int型可为NULL的字段,而聚集索引叶级是存储数据本身

叶级是一个4字节的INT列,无变长列,加上3字节的NULL位图,再加上4字节的行头开销:两个表的叶级minSize =4+0+3+4=11

非叶级是一个4字节的INT列,无变长列,加上3字节的NULL位图,加上1字节的行头开销,再加6字节的子页指针:两个表的非叶级minSize=4+0+3+1+6=14

tb1的索引行大小是一致的minSize=maxSize,因为它是唯一的。tb2的索引行大小不一致,有大有小,大的索引行是因为:a)不唯一 b)UNIQUIFIER

唯一标识列增加了2+1*2+4=8字节开销,tb2的min和max相差就是这8字节。

tb2的叶级maxSize=4+8+3+4=19

tb2的非叶级maxSize=4+8+3+1+6=22

小结:非唯一聚集索引为保证索引键值唯一性,会生成UNIQUIFIER与键列一起组成索引键值。同时无论在叶级还是非叶页级,都比唯一索引占用更多存储空间。

❹ SQL数据库 使用命令为表studinfo的studsex字段建立一个非聚集唯一索引myidx,请

非聚集索引,前提条件是:

该 字段是IDENTITY KEY NONCLUSTERED类型,也就是指定NONCLUSTERED关键字。


比如:

CREATETABLEMyTableKeyExample
{
,
Column2int

聚集索引默认与主键相匹配,在设置主键时,SQL Server会默认在主键列创建聚集索引。但是可以手动更改为在任意一个列创建聚集索引,然后在另一个字段或多个字段上定义主键。这时主键将会被作为一个唯一的非聚集索引(唯一索引)被创建。通过指定NONCLUSTERED关键字就可以做到。


声明唯一索引的语法很简单,只是多了个UNIQUE关键字。

比如:

CREATEUNIQUENONCLUSTEREDINDEX[AK_Proct_Name]ONProction.Proct([Name]);

❺ 在sql中建立唯一索引要用到什么保留字

解决方案:
1.必须在TSQL前Set ARITHABORT ON,代码如下

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

2.在ADO中,你可以这样来写(C#代码)
MyConnection.Execute("SET ARITHABORT ON");

如果以上你都觉得很麻烦或由于一些原因没法更改,你可以尝试修改SQL Server服务器选项
3.exec sp_dboption 'yourdb','ARITHABORT','true'
或者
4.1: ALTER DATABASE yourdb
2: SET ARITHABORT ON

❻ 如何创建唯一索引

例如,如果计划频繁查询 employee 表中(其中主键为 emp_id)的身份证号码 (ssn)列,并希望确保身份证号码是唯一的,则可以在 ssn 上创建唯一索引。如果用户为一个以上的雇员输入相同的身份证号码,则数据库将显示错误而且无法保存该表。在创建或修改唯一索引时,可以可设置一个忽略重复键的选项。如果此选项已设置为“是”,当您试图通过添加影响多行的数据来创建重复键(使用 INSERT 语句)时,则不会添加包含重复项的行;如果此选项设置为“否”,则整个插入操作将失败,并且将回滚所有数据。 创建唯一索引 在对象资源管理器中,右键单击表,再单击“设计”。此时,将在表设计器中打开该表。在表设计器菜单上,单击“索引/键”。单击“添加”。“选定的主/唯一键或索引”列表将显示新索引的系统分配名称。在网格中,单击“类型”。从属性右侧的下拉列表中选择“索引”。在“列”下,选择要编制索引的列。最多可选择 16 列。为获得最佳的性能,请只为每个索引选择一列或两列。对于所选的每一列,指定索引是以升序还是以降序来排列此列的值。在网格中,单击“是唯一的”。从属性右侧的下拉列表中选择“是”。如果希望忽略会在唯一索引中创建重复键(用 INSERT 语句)的数据,请选择“忽略重复键”选项并选择“是”。在保存表或关系图时将在数据库中创建该索引。注意:如果单个列在多行中包含 NULL,则无法对该列创建唯一索引。同样,如果列的组合在多行中包含 NULL,则无法对多个列创建唯一索引。在进行索引时,它们都被视为重复值。

❼ 创建唯一索引的sql语句是什么

创建唯一索引的sql语句如下:

  • CREATE [UNIQUE|CLUSTERED] INDEX INDEX_NAME ON TABLE_NAME(PROPERTY_NAME)

  • 其中UNIQUE和CLUSTERED为可选项,分别是建立唯一索引和聚簇索引。

  • 具体解释为:
    UNIQUE:表示此索引的每一个索引值只对应唯一的数据。
    CLUSTERED:表示要建立的索引时聚簇索引,即索引项的顺序与表中记录的物理顺序一致的索引组织。