首页 > 数据库 >8.4 SQL Server唯一索引

8.4 SQL Server唯一索引

时间:2023-01-30 10:36:21浏览次数:52  
标签:8.4 t1 Server 唯一 索引 SQL NULL email

SQL Server唯一索引(Unique Index)

目录

简介

唯一索引确保索引键列不包含重复值。

唯一索引可以由一列或多列组成。如果唯一索引有一列,则此列中的值将是唯一的。如果唯一索引有多个列,则这些列中的值组合是唯一的。

任何试图向唯一索引键列中插入或更新数据而导致重复的行为都会报错。

唯一索引可以是聚集索引或非聚集索引。

要创建唯一索引,可以使用CREATE UNIQUE INDEX语句,如下所示:

CREATE UNIQUE INDEX index_name
ON table_name(column_list);

示例

A)创建包含一列的唯一约束

通过邮件[email protected]查找客户:

SELECT
    customer_id, 
    email 
FROM
    sales.customers
WHERE 
    email = '[email protected]';

查询优化器必须扫描整个聚集索引才能找到该行。

为了加快查询速度,可以在电子邮件(email)列添加非聚集索引。

但是,假设每个客户都有唯一的电子邮件,您可以为电子邮件列创建唯一索引。

由于sales.customers表已经有数据了,所以要先检查电子邮件列中的重复值:

SELECT 
    email, 
    COUNT(email)
FROM 
    sales.customers
GROUP BY 
    email
HAVING 
    COUNT(email) > 1;

查询返回一个空结果集。说明电子邮件列中没有重复的值。
因此,可以直接为sales.customers的电子邮件列创建唯一索引:

CREATE UNIQUE INDEX ix_cust_email 
ON sales.customers(email);

现在,查询优化器将走ix_cust_email索引,并使用索引查找Index Seek)方法搜索行。

B)创建包含多列的唯一约束

首先,创建一个名为t1的表,其中有两列:

CREATE TABLE t1 (
    a INT, 
    b INT
);

接下来,创建一个包含a列和b列的唯一索引:

CREATE UNIQUE INDEX ix_uniq_ab 
ON t1(a, b);

然后,在t1表中插入新行:

INSERT INTO t1(a,b) VALUES(1,1);

然后,在t1表中插入另一行。请注意,值1在a列中重复,但a列和b列中的值组合不重复:

INSERT INTO t1(a,b) VALUES(1,2);

正常插入,没有问题

最后,将已经存在的行插入t1表中:

INSERT INTO t1(a,b) VALUES(1,2);

SQL Server报错如下:

Cannot insert duplicate key row in object 'dbo.t1' with unique index 'ix_ab'. The duplicate key value is (1, 2).

SQL Server唯一索引与NULL

NULL是特殊的。是一个标记,表示没有数据或者数据不适用。

NULL甚至不等于它本身。但是,当涉及到唯一索引时,SQLServer会对NULL值进行相同的处理。这意味着如果在一个可为NULL的列上创建唯一索引,则此列中只能有一个NULL值。

以下创建名为t2的新表,并在a列上定义唯一索引:

CREATE TABLE t2(
    a INT
);

CREATE UNIQUE INDEX a_uniq_t2
ON t2(a);

在a列中插入NULL:

INSERT INTO t2(a) VALUES(NULL);

但是,如果再次执行上述查询,SQL Server会因重复的NULL值而报错:

INSERT INTO t2(a) VALUES(NULL);

唯一索引(Unique index)与唯一约束(UNIQUE constraint)

唯一索引和唯一约束都强制一列或多列中值的唯一性。
SQL Server以相同的方式验证唯一索引和唯一约束的重复项。

创建唯一约束时,SQL Server会在幕后创建与此约束关联的唯一索引。

但是,对列创建唯一约束可以明确唯一索引的作用。

标签:8.4,t1,Server,唯一,索引,SQL,NULL,email
From: https://www.cnblogs.com/michaelshen/p/17074703.html

相关文章

  • 8.5 SQL Server包含列索引
    SQLServer索引与包括的列目录SQLServer索引与包括的列简介创建包含列的索引的语法简介本文使用sales.customers表作为示例下面语句在email列创建唯一约束:CREATEU......
  • 8.6 SQL Server筛选索引
    SQLServer筛选索引目录SQLServer筛选索引简介示例筛选索引的优点简介如果使用得当,非聚集索引可以大大提高查询性能。然而,非聚集索引的好处是有代价的:存储和维护。......
  • 8.7 SQL Server计算列上的索引
    SQLServer计算列上的索引目录SQLServer计算列上的索引简介计算列索引的要求简介有如下客户表:查找居住在garry.espinoza的客户:SELECTfirst_name,last......
  • 让Windows Server 2008r2 IIS7.5 ASP.NET 支持10万并发请求
    由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误。为了避免这样的错误,我们根据相关文档调整了......
  • docker mysql
    dockerpullmysqldockerrun-itd--namemysql-p3307:3306-eMYSQL_ROOT_PASSWORD=123456mysql--character-set-server=utf8mb4--collation-server=utf8......
  • SQL Server 返回了错误 21(设备未就绪。) 解决方法
    https://www.cnblogs.com/xx_cs/archive/2013/05/31/3110881.html在文件'G:\LedDB\LedDB.mdf' 中、偏移量为0x00000001a9a000 的位置执行 读取 期间,操作系统已经向SQL......
  • MysqlDump导出
    mysqldump常用选项--no-create-db,---取消创建数据库sql(默认存在)--no-create-info,---取消创建表sql(默认存在)--no-data---不导出数据(默认导出)--add-drop......
  • MGR复制架构+自动化运维平台,汽车之家MySQL高可用建设实践
    前言 MySQL具有开源免费,运维简单,性能好等优点,是在汽车之家使用最多的一种数据库。数据库作为应用的后端存储,承担着数据持久化存储的功能,是应用可以正常对外提......
  • mysql第二天
    mysql5.7修改默认字符集由于5.7版本的mysql默认使用latin的字符集,所以在创建表成功后向表中插入中文数据会失败。所以要修改编码方式。在存放mysql的数据文件中找到my.......
  • Mysql数据库插入数据时出现Unknown column ‘admin‘ in ‘field list‘错误
    报错内容  报错原因字段和插入的值所用的引号不对 解决方案 insertintot_user(`username`,`password`,`email`)VALUES(`admin`,`admin`,`[email protected]......