最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL添加唯一索引的常見方法

 更新時間:2026年02月01日 08:16:42   作者:detayun  
唯一索引是MySQL中保證數(shù)據(jù)完整性的重要工具,它強制要求索引列的值必須唯一,,與主鍵索引不同,唯一索引允許存在多個,且不隱含非空約束,本文給大家介紹了關(guān)于MySQL添加唯一索引的常見方法,需要的朋友可以參考下

一、唯一索引的核心價值

唯一索引是MySQL中保證數(shù)據(jù)完整性的重要工具,它強制要求索引列的值必須唯一(允許NULL值,但多NULL值會被視為不同值)。與主鍵索引不同,唯一索引允許存在多個,且不隱含非空約束。典型應(yīng)用場景包括:

  • 用戶郵箱/手機號唯一驗證
  • 訂單號防重復(fù)
  • 商品SKU編碼唯一性約束

二、建表時添加唯一索引

語法模板

CREATE TABLE table_name (
    column1 datatype UNIQUE,  -- 單列唯一索引
    column2 datatype,
    ...,
    UNIQUE (col_a, col_b)     -- 多列組合唯一索引
);

實戰(zhàn)示例

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,  -- 單列唯一索引
    email VARCHAR(100) NOT NULL,
    phone VARCHAR(20),
    INDEX idx_email_phone (email, phone) UNIQUE  -- 組合唯一索引
);

效果驗證
插入重復(fù)用戶名或(email+phone)組合時,MySQL將拋出ERROR 1062 (23000): Duplicate entry錯誤。

三、建表后添加唯一索引

方法1:ALTER TABLE(推薦)

ALTER TABLE products 
ADD UNIQUE uk_product_sku (sku);  -- 單列索引

ALTER TABLE orders 
ADD UNIQUE uk_order_user_time (user_id, order_time);  -- 組合索引

方法2:CREATE INDEX

CREATE UNIQUE INDEX idx_unique_username ON customers(username);

四、進階操作與注意事項

1. 索引命名規(guī)范
建議使用前綴uk_(Unique Key)或uniq_開頭,如uk_user_email,便于維護。

2. 處理沖突數(shù)據(jù)
添加唯一索引前,需先清理重復(fù)數(shù)據(jù):

-- 查找重復(fù)數(shù)據(jù)
SELECT col, COUNT(*) 
FROM table_name 
GROUP BY col 
HAVING COUNT(*) > 1;

-- 刪除重復(fù)記錄(保留最新)
DELETE t1 
FROM table_name t1
INNER JOIN table_name t2 
WHERE t1.id > t2.id AND t1.col = t2.col;

3. 性能影響評估

  • 寫操作性能下降(約10-30%)
  • 查詢速度提升(尤其在WHERE/ORDER BY場景)
  • 索引占用存儲空間(約表大小的1.2-1.5倍)

4. 特殊場景處理

  • 忽略重復(fù)插入:使用INSERT IGNORE
INSERT IGNORE INTO users (username) VALUES ('john');
  • 條件唯一索引(MySQL 8.0+):
CREATE TABLE logs (
    id INT,
    event_date DATE,
    UNIQUE (id, event_date)  -- 僅當event_date在最近30天時生效
) PARTITION BY RANGE COLUMNS(event_date);

五、最佳實踐建議

  1. 前綴索引優(yōu)化:對長文本列使用前綴索引
ALTER TABLE articles ADD UNIQUE (title(50));  -- 僅索引前50字符
  1. 避免過度索引:高頻寫入表建議不超過5個索引
  2. 監(jiān)控索引碎片:定期執(zhí)行OPTIMIZE TABLE重建索引
  3. 聯(lián)合索引順序:將區(qū)分度高的列放在組合索引左側(cè)

完整示例SQL

-- 創(chuàng)建商品表并添加唯一索引
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sku VARCHAR(20) NOT NULL,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT uk_product_sku UNIQUE (sku)  -- 命名約束
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 添加組合唯一索引(訂單號+用戶ID)
ALTER TABLE orders ADD UNIQUE uk_order_user (order_number, user_id);

總結(jié)

MySQL唯一索引是保障數(shù)據(jù)一致性的重要防線。通過合理的索引設(shè)計,可以在保證數(shù)據(jù)質(zhì)量的同時提升查詢性能。實際操作中需平衡讀寫性能、存儲空間和業(yè)務(wù)需求,定期使用EXPLAIN分析索引使用效率,持續(xù)優(yōu)化索引策略。

以上就是MySQL添加唯一索引的常見方法的詳細內(nèi)容,更多關(guān)于MySQL添加唯一索引的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 面試提問mysql一張表到底能存多少數(shù)據(jù)

    面試提問mysql一張表到底能存多少數(shù)據(jù)

    這篇文章主要為大家介紹了面試提問mysql一張表到底能存多少數(shù)據(jù)的問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • mysql使用from與join兩表查詢的區(qū)別總結(jié)

    mysql使用from與join兩表查詢的區(qū)別總結(jié)

    這篇文章主要給大家介紹了關(guān)于mysql使用from與join兩表查詢的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Mysql之DELETE操作對應(yīng)的undo日志方式

    Mysql之DELETE操作對應(yīng)的undo日志方式

    InnoDB通過正常記錄鏈表和垃圾鏈表管理數(shù)據(jù)頁,刪除記錄先標記為deletemark,后由purge線程移入垃圾鏈表回收空間,PAGE_FREE指向垃圾鏈表頭,PAGE_GARBAGE記錄可重用空間大小,Undo日志保存trx_id和roll_pointer,用于版本控制和回滾
    2025-08-08
  • MySQL數(shù)據(jù)類型全解析

    MySQL數(shù)據(jù)類型全解析

    這篇文章主要介紹了MySQL數(shù)據(jù)類型的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-01-01
  • MySQL數(shù)據(jù)庫運維之數(shù)據(jù)恢復(fù)的方法

    MySQL數(shù)據(jù)庫運維之數(shù)據(jù)恢復(fù)的方法

    本篇文章主要介紹了MySQL數(shù)據(jù)庫運維之數(shù)據(jù)恢復(fù)的方法,此處總結(jié)一下恢復(fù)方案,并結(jié)合數(shù)據(jù)庫的二進制日志做下數(shù)據(jù)恢復(fù)的示范。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 一次Mysql使用IN大數(shù)據(jù)量的優(yōu)化記錄

    一次Mysql使用IN大數(shù)據(jù)量的優(yōu)化記錄

    這篇文章主要給大家介紹了關(guān)于Mysql使用IN大數(shù)據(jù)量的優(yōu)化的實戰(zhàn)記錄,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 分享幾道關(guān)于MySQL索引的重點面試題

    分享幾道關(guān)于MySQL索引的重點面試題

    這篇文章主要給大家介紹了幾道關(guān)于MySQL索引的重點面試題,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • MySQL中根據(jù)出生日期計算年齡兩種方法

    MySQL中根據(jù)出生日期計算年齡兩種方法

    使用SQL語句計算年齡,在事務(wù)處理和日期計算中,較為常見,下面這篇文章主要給大家介紹了關(guān)于MySQL中根據(jù)出生日期計算年齡的兩種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-05-05
  • MySQL事務(wù)保證數(shù)據(jù)一致性的核心講解

    MySQL事務(wù)保證數(shù)據(jù)一致性的核心講解

    這篇文章主要介紹了MySQL事務(wù)實現(xiàn)保證數(shù)據(jù)一致性的原理,事務(wù)不是萬能藥,它不能解決所有數(shù)據(jù)問題,比如硬件物理損壞需要靠備份恢復(fù),但它是保障數(shù)據(jù)一致性的基礎(chǔ),沒有事務(wù),任何涉及多步操作的數(shù)據(jù)場景,都可能出現(xiàn)翻車風險,需要的朋友可以參考下
    2025-10-10
  • MySQL中binlog+dump備份還原詳細教程

    MySQL中binlog+dump備份還原詳細教程

    MySQL備份是指將MySQL數(shù)據(jù)庫中的數(shù)據(jù)進行備份,以便在需要的時候能夠恢復(fù)數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MySQL中binlog+dump備份還原的相關(guān)資料,需要的朋友可以參考下
    2023-05-05

最新評論

东安县| 县级市| 建水县| 崇文区| 平乐县| 桓仁| 常宁市| 通江县| 昌宁县| 沙坪坝区| 石柱| 布拖县| 江门市| 五指山市| 叙永县| 南平市| 哈尔滨市| 雅江县| 鄂州市| 宜宾市| 德江县| 甘孜县| 华阴市| 张家港市| 湖南省| 同德县| 南宫市| 和平区| 乌兰察布市| 琼结县| 麻栗坡县| 日土县| 常宁市| 常宁市| 方山县| 黄平县| 永川市| 昆山市| 湟源县| 鹤壁市| 西乡县|