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

mysql主鍵和唯一鍵的使用與區(qū)別

 更新時間:2026年02月03日 10:12:21   作者:import_random  
本文主要介紹了mysql主鍵和唯一鍵的使用與區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 基本概念

(1)主鍵 (Primary Key)

唯一標(biāo)識表中每條記錄,不允許重復(fù)且不能為 NULL。

主鍵也可以由多個列組成,這被稱為‌復(fù)合主鍵‌(Composite Primary Key)或‌聯(lián)合主鍵‌。

當(dāng)單個列無法唯一標(biāo)識表中的每一行時,就可以將多個列組合起來作為主鍵。

組合后的列值整體必須是唯一的,且每個參與的列都不能為NULL。

復(fù)合主鍵的核心特性

  • 唯一性‌:所有參與列的值組合起來必須在整個表中唯一。
  • 非空性‌:組成復(fù)合主鍵的每一個列都必須定義為 NOT NULL。
  • 標(biāo)識性‌:整個列集合共同作用,用于唯一標(biāo)識表中的一條記錄。

(2)唯一鍵 (Unique Key)

確保某列或列組合的值唯一,但允許 NULL 值。

2. 如何表示

(1)創(chuàng)建表時定義:

-- 創(chuàng)建包含主鍵和唯一鍵的表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,           -- 主鍵
    email VARCHAR(100) UNIQUE,                   -- 唯一鍵(簡寫)
    username VARCHAR(50) UNIQUE,                 -- 另一個唯一鍵
    phone VARCHAR(20),
    CONSTRAINT uk_phone UNIQUE (phone)           -- 唯一鍵(完整寫法)
);

-- 或者復(fù)合鍵定義方式
CREATE TABLE orders (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id),          -- 復(fù)合主鍵
    UNIQUE KEY uk_order_product (order_id, product_id) -- 復(fù)合唯一鍵
);

(2)修改表時添加:

-- 添加主鍵
ALTER TABLE users ADD PRIMARY KEY (id);

-- 添加唯一鍵
ALTER TABLE users ADD UNIQUE KEY uk_email (email);
ALTER TABLE users ADD CONSTRAINT uk_username UNIQUE (username);

3. 主要區(qū)別對比

特性主鍵 (Primary Key)唯一鍵 (Unique Key)
數(shù)量限制每表只能有一個每表可以有多個
NULL 值不允許 NULL允許 NULL(但只能有一個 NULL,某些數(shù)據(jù)庫允許多個)
索引類型默認(rèn)創(chuàng)建聚簇索引(InnoDB)創(chuàng)建非聚簇索引
用途標(biāo)識記錄的唯一性確保數(shù)據(jù)的唯一性約束
外鍵引用可以被其他表的外鍵引用很少被外鍵引用
自動增長常與 AUTO_INCREMENT 一起使用不能使用 AUTO_INCREMENT

4. 詳細示例

-- 創(chuàng)建示例表
CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT PRIMARY KEY,       -- 主鍵,自增長
    emp_code VARCHAR(10) UNIQUE,                -- 員工編號,唯一但不作為主鍵
    email VARCHAR(100) UNIQUE,                  -- 郵箱,唯一
    department VARCHAR(50),
    hire_date DATE
);

-- 插入數(shù)據(jù)
INSERT INTO employees (emp_code, email, department) VALUES
('E001', 'john@company.com', 'IT'),
('E002', 'jane@company.com', 'HR');

-- 以下操作會失?。ㄟ`反唯一約束)
INSERT INTO employees (emp_code, email) VALUES 
('E001', 'tom@company.com');  -- emp_code 重復(fù)

-- 以下操作會失敗(違反主鍵約束)
INSERT INTO employees (emp_id, emp_code, email) VALUES 
(1, 'E003', 'sam@company.com');  -- emp_id 重復(fù)

-- 允許 NULL 值的唯一鍵示例
CREATE TABLE contacts (
    id INT PRIMARY KEY,
    phone VARCHAR(20) UNIQUE,
    email VARCHAR(100) UNIQUE
);

-- 可以插入多個 NULL 到 phone 列(MySQL 特性)
INSERT INTO contacts VALUES (1, NULL, 'a@test.com');
INSERT INTO contacts VALUES (2, NULL, 'b@test.com');  -- 允許,因為 NULL != NULL

5. 復(fù)合鍵示例

-- 課程注冊表:一個學(xué)生不能重復(fù)注冊同一門課
CREATE TABLE course_registrations (
    student_id INT,
    course_id INT,
    registration_date DATE,
    PRIMARY KEY (student_id, course_id),           -- 復(fù)合主鍵
    UNIQUE KEY uk_student_course (student_id, course_id)  -- 復(fù)合唯一鍵
);

-- 有效數(shù)據(jù)
INSERT INTO course_registrations VALUES 
(1, 101, '2024-01-10'),
(1, 102, '2024-01-10'),  -- 同一個學(xué)生不同課程
(2, 101, '2024-01-11');  -- 不同學(xué)生同一課程

-- 以下會失敗(違反主鍵/唯一鍵約束)
INSERT INTO course_registrations VALUES 
(1, 101, '2024-01-12');  -- student_id=1 和 course_id=101 已存在

6. 實際應(yīng)用場景

主鍵使用場景:

  • 用戶表的用戶ID
  • 訂單表的訂單ID
  • 產(chǎn)品表的產(chǎn)品ID

唯一鍵使用場景:

  • 用戶表的郵箱、手機號、用戶名
  • 身份證號碼
  • 員工工號
  • 防止重復(fù)的業(yè)務(wù)組合(如用戶+產(chǎn)品收藏記錄)

7. 性能考慮

-- 查看表的索引信息(包括主鍵和唯一鍵)
SHOW INDEX FROM users;

-- 執(zhí)行計劃分析
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

8. 總結(jié)

  • 主鍵是表的"身份證",唯一鍵是"防重復(fù)檢查器"
  • 主鍵更嚴(yán)格(不能 NULL),唯一鍵更靈活(允許 NULL)
  • 設(shè)計時通常用自增主鍵作為技術(shù)主鍵,用唯一鍵保護業(yè)務(wù)數(shù)據(jù)唯一性
  • 兩者都自動創(chuàng)建索引,提高查詢性能,但也會影響插入/更新速度

根據(jù)你的業(yè)務(wù)需求選擇合適的方式:需要嚴(yán)格標(biāo)識每條記錄用主鍵,只需要防止數(shù)據(jù)重復(fù)用唯一鍵。

到此這篇關(guān)于mysql主鍵和唯一鍵的使用與區(qū)別的文章就介紹到這了,更多相關(guān)mysql主鍵和唯一鍵內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql?8.0?綠色版安裝教程詳解

    Mysql?8.0?綠色版安裝教程詳解

    這篇文章主要為大家詳細介紹了Mysql?8.0?綠色版安裝教程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • mysql如何修改index索引名稱

    mysql如何修改index索引名稱

    這篇文章主要介紹了mysql如何修改index索引名稱問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • MySQL Proxy的安裝及基本命令使用教程

    MySQL Proxy的安裝及基本命令使用教程

    這篇文章主要介紹了MySQL Proxy的安裝及基本命令使用教程,MySQL Proxy通常被用作實現(xiàn)讀寫分離,需要的朋友可以參考下
    2015-12-12
  • MySQL查詢截取的深入分析

    MySQL查詢截取的深入分析

    這篇文章主要給大家介紹了關(guān)于MySQL查詢截取的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 深入JDBC sqlserver連接寫法的詳解

    深入JDBC sqlserver連接寫法的詳解

    本篇文章是對JDBC sqlserver的連接寫法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • mysql 5.7.11 winx64.zip安裝配置方法圖文教程

    mysql 5.7.11 winx64.zip安裝配置方法圖文教程

    這篇文章主要為大家分享了mysql5.7.11安裝配置方法圖文教程,具有一定的參考價值,感興趣的朋友可以參考一下
    2017-02-02
  • windows 10下mysql 5.7.21 winx64安裝配置方法圖文教程

    windows 10下mysql 5.7.21 winx64安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了windows 10下mysql 5.7.21 winx64安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Mysql性能優(yōu)化方案分享

    Mysql性能優(yōu)化方案分享

    這篇文章主要為大家分享了Mysql性能優(yōu)化方案,幫助大家進行Mysql性能優(yōu)化,感興趣的小伙伴們可以參考一下
    2016-03-03
  • mysql.user表查看數(shù)據(jù)庫所有用戶信息SQL語句

    mysql.user表查看數(shù)據(jù)庫所有用戶信息SQL語句

    在MySQL中查看賬號信息有多種方法,最直接的是通過執(zhí)行SQL查詢,從mysql.user表中獲取用戶及其權(quán)限等詳細信息,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • sql四大排名函數(shù)之ROW_NUMBER、RANK、DENSE_RANK、NTILE使用介紹

    sql四大排名函數(shù)之ROW_NUMBER、RANK、DENSE_RANK、NTILE使用介紹

    這篇文章主要介紹了sql四大排名函數(shù)之ROW_NUMBER、RANK、DENSE_RANK、NTILE使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

澄江县| 靖江市| 乐亭县| 威远县| 庄河市| 衡水市| 承德市| 临泉县| 长岭县| 佳木斯市| 蒙阴县| 民权县| 四平市| 车致| 永昌县| 阳曲县| 河津市| 湟中县| 巍山| 弥渡县| 鹤峰县| 蛟河市| 元江| 通江县| 江源县| 石阡县| 绥滨县| 巴塘县| 汪清县| 古丈县| 苗栗县| 吉安县| 弥勒县| 双辽市| 陆丰市| 峨边| 枣庄市| 永济市| 凤台县| 宾阳县| 江川县|