MySQL - 唯一索引

唯一索引

  • 所谓唯一索引,就是在创建索引时,限制索引的字段值必须是唯一的。通过该类型的索引可以比普通索引更快速地查询某条记录。

    1. 创建表时定义索引

    CREATE TABLE tablename(
        propname1 type1,
        ……
        propnamen type..n,
        UNIQUE INDEX | KEY [indexname] (propnamen [(length)] [ ASC | DESC ] ) );
    

    注意
    参数UNIQUE INDEX和UNIQUE KEY是用来指定字段为索引的,两者选择其中之一即可;
    参数indexname是索引名字,可省略;
    参数propnamen是索引对应的字段的名称,该字段必须为前面定义好的字段且必须定义为 UNIQUE 约束;
    参数length是可选参数,其指索引的长度,必须是字符串类型才可以使用;
    参数ASC和DESC都是可选参数,ASC表示升序排列,DESC表示降序排列,如果不指定,则为升序。

    mysql> create table class(id int, name varchar(64), teacher varchar(64), UNIQUE INDEX name_index(name));	//创建class表,同时指定name为唯一索引列
    mysql> show create table class;						//查询表结构
    mysql> insert into class values(1, '一班', '张三');	//插入数据1
    mysql> insert into class values(2, '二班', '李四');	//插入数据2
    mysql> select * from class where id>0;				//根据列查询
    

    在这里插入图片描述

    2. 已存在的表上创建索引
    方法一:

    CREATE UNIQUE INDEX indexname  
        ON tablename (propname [(length)] [ASC|DESC]);  
    

    在这里插入图片描述

    方法二:

    ALTER TABLE tablename ADD UNIQUE INDEX | KEY indexname (propname [(length)] [ASC|DESC]);  
    

    在这里插入图片描述

<think>我们被要求回答:如何在MySQL中创建或设置唯一索引 根据引用内容,我们可以总结出三种创建唯一索引的方法: 1. 在创建表时直接指定唯一索引 2. 使用ALTER TABLE语句在已存在的表上添加唯一索引 3. 使用CREATE INDEX语句在已存在的表上创建唯一索引(注意:在MySQL中,CREATE INDEX不能用于创建主键索引,但可以用于创建唯一索引和普通索引) 另外,引用中提到了唯一索引的特点:索引列的值必须唯一,但允许有空值(NULL)。如果是组合索引,则列值的组合必须唯一。 下面我们分别详细说明这三种方法:</think>### MySQL 创建唯一索引的三种方法 在 MySQL 中创建唯一索引可确保列值唯一性,防止重复数据插入。以下是三种实现方式: --- #### 方法一:建表时创建唯一索引(推荐) ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, -- 单列唯一索引 UNIQUE INDEX idx_email (email), -- 组合唯一索引 UNIQUE INDEX idx_username_email (username, email) ); ``` **特点**: - `UNIQUE INDEX` 声明唯一约束 - `idx_email` 确保 email 唯一 - `idx_username_email` 确保 username+email 组合唯一[^1][^2] --- #### 方法二:使用 ALTER TABLE 添加唯一索引 ```sql -- 添加单列唯一索引 ALTER TABLE users ADD UNIQUE INDEX idx_email (email); -- 添加组合唯一索引 ALTER TABLE users ADD UNIQUE INDEX idx_name_email (username, email); ``` **适用场景**: - 已存在表结构修改 - 需要动态添加唯一约束 - 支持多列组合索引[^2] --- #### 方法三:使用 CREATE INDEX 创建 ```sql -- 创建单列唯一索引 CREATE UNIQUE INDEX idx_email ON users(email); -- 创建组合唯一索引 CREATE UNIQUE INDEX idx_name_email ON users(username, email); ``` **注意**: - 与 `ALTER TABLE` 等效 - 不能用于主键索引(主键需用 `PRIMARY KEY`)[^3] --- ### 唯一索引特性 | 特性 | 说明 | |---------------------|---------------------------------------------------------------------| | **唯一性约束** | 禁止插入重复值(NULL 除外) | | **NULL 处理** | 允许 NULL 值,但 NULL 不参与唯一性检查(可存在多个 NULL) | | **组合索引** | 多列组合值必须唯一 | | **查询优化** | 提升等值查询效率(比普通索引更快) | | **冲突处理** | 插入重复值时触发 `Duplicate entry` 错误(错误码 1062)[^4] | --- ### 最佳实践 1. **主键 vs 唯一索引**: ```sql -- 主键(隐式唯一且非空) ALTER TABLE users ADD PRIMARY KEY (id); -- 唯一索引(允许空值) ALTER TABLE users ADD UNIQUE INDEX idx_email (email); ``` 2. **查看已有索引**: ```sql SHOW INDEX FROM users; ``` 3. **删除唯一索引**: ```sql ALTER TABLE users DROP INDEX idx_email; ``` 4. **性能建议**: - 频繁查询的列优先添加唯一索引 - 避免在超长文本列(如 TEXT)建唯一索引 - 组合索引字段顺序:高区分度列在前 > **注意**:唯一索引会略微降低写入性能,但能显著提升查询效率和数据完整性[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值