mysql中key 、primary key 、unique key 與index區別【轉】

来源:https://www.cnblogs.com/KillBugMe/archive/2020/04/11/12681488.html
-Advertisement-
Play Games

一、key與primary key區別 解析: KEY wh_logrecord_user_name (user_name) 本表的 欄位與 表`user_name`欄位建立外鍵 括弧外是建立外鍵的對應表,括弧內是對應欄位 類似還有 KEY user(userid) 當然,key未必都是外鍵 總結: ...


一、key與primary key區別

CREATE TABLE wh_logrecord (
logrecord_id int(11) NOT NULL auto_increment,
user_name varchar(100) default NULL,
operation_time datetime default NULL,
logrecord_operation varchar(100) default NULL,
PRIMARY KEY (logrecord_id),
KEY wh_logrecord_user_name (user_name)
)

 
解析:
KEY wh_logrecord_user_name (user_name)
本表的user_name欄位與wh_logrecord_user_nameuser_name欄位建立外鍵
括弧外是建立外鍵的對應表,括弧內是對應欄位
類似還有 KEY user(userid)
當然,key未必都是外鍵

 
總結:
Key是索引約束,對錶中欄位進行約束索引的,都是通過primary foreign unique等創建的。常見有foreign key,外鍵關聯用的。

 
KEY forum (status,type,displayorder) # 是多列索引(鍵)
KEY tid (tid) # 是單列索引(鍵)。

 
如建表時: KEY forum (status,type,displayorder)
select * from table group by status,type,displayorder 是否就自動用上了此索引,
而當 select * from table group by status 此索引有用嗎?

 
key的用途:主要是用來加快查詢速度的。

 

二、KEY與INDEX區別

批註:這部分我仍雲里霧裡。
KEY通常是INDEX同義詞。如果關鍵字屬性PRIMARY KEY在列定義中已給定,則PRIMARY KEY也可以只指定為KEY。這麼做的目的是與其它資料庫系統相容。 PRIMARY KEY是一個唯一KEY,此時,所有的關鍵字列必須定義為NOT NULL。如果這些列沒有被明確地定義為NOT NULL,MySQL應隱含地定義這些列。一個表只有一個PRIMARY KEY。

 
MySQL 中Index 與Key 的區別

 
Key即鍵值,是關係模型理論中的一部份,比如有主鍵(Primary Key),外鍵(Foreign Key)等,用於數據完整性檢否與唯一性約束等。而Index則處於實現層面,比如可以對錶個的任意列建立索引,那麼當建立索引的列處於SQL語句中的Where條件中時,就可以得到快速的數據定位,從而快速檢索。至於Unique Index,則只是屬於Index中的一種而已,建立了Unique Index表示此列數據不可重覆,猜想MySQL對Unique Index類型的索引可以做進一步特殊優化吧。

 
於是乎,在設計表的時候,Key只是要處於模型層面的,而當需要進行查詢優化,則對相關列建立索引即可。

 
另外,在MySQL中,對於一個Primary Key的列,MySQL已經自動對其建立了Unique Index,無需重覆再在上面建立索引了。

 
搜索到的一段解釋:

 

Note that “primary” is called PRIMARY KEY not INDEX.
KEY is something on the logical level, describes your table and database design (i.e. enforces referential integrity…)
INDEX is something on the physical level, helps improve access time for table operations.
Behind every PK there is (usually) unique index created (automatically).

 

三、mysql中UNIQUE KEYPRIMARY KEY有什麼區別

1,Primary key的1個或多個列必須為NOT NULL,如果列為NULL,在增加PRIMARY KEY時,列自動更改為NOT NULL。而UNIQUE KEY 對列沒有此要求

 
2,一個表只能有一個PRIMARY KEY,但可以有多個UNIQUE KEY

 
3,主鍵和唯一鍵約束是通過參考索引實施的,如果插入的值均為NULL,則根據索引的原理,全NULL值不被記錄在索引上,所以插入全NULL值時,可以有重覆的,而其他的則不能插入重覆值。

alter table t add constraint uk_t_1 unique (a,b);
insert into t (a ,b ) values (null,1);    # 不能重覆
insert into t (a ,b ) values (null,null);#可以重覆

 
四、使用UNIQUE KEY

CREATE TABLE `secure_vulnerability_warning` (
  `id` int(10) NOT NULL auto_increment,
  `date` date NOT NULL,
  `type` varchar(100) NOT NULL,
  `sub_type` varchar(100) NOT NULL,
  `domain_name` varchar(128) NOT NULL,
  `url` text NOT NULL,
  `parameters` text NOT NULL,
  `hash` varchar(100) NOT NULL,
  `deal` int(1) NOT NULL,
  `deal_date` date default NULL,
  `remark` text,
  `last_push_time` datetime default NULL,
  `push_times` int(11) default '1',
  `first_set_ok_time` datetime default NULL,
  `last_set_ok_time` datetime default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `date` (`date`,`hash`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

UNIQUE KEY的用途:主要是用來防止數據插入的時候重覆的。

1,創建表時

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)

如果需要命名 UNIQUE 約束,以及為多個列定義 UNIQUE 約束,請使用下麵的 SQL 語法:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)

2,當表已被創建時,如需在 "Id_P" 列創建 UNIQUE 約束,請使用下列 SQL:

ALTER TABLE Persons
ADD UNIQUE (Id_P)

如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下麵的 SQL 語法:

ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

3,撤銷 UNIQUE 約束

如需撤銷 UNIQUE 約束,請使用下麵的 SQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

文章轉自:https://www.iteye.com/blog/zccst-1697043


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 不允許多個Host請求頭 2. 忽略額外的Transfer-Encoding請求頭 3.修複在HTTP/2時的socket泄露 4.修複使用OCSP時,工作進程中可能會發生分段錯誤 5.更改使用“ error_page”指令重定向了494時,把狀態碼400換成494 6.修複在njs模塊和使用 ...
  • 利用Docker搭建主從伺服器 首先拉取docker鏡像,我們這裡使用5.7版本的mysql: 然後使用此鏡像啟動容器,這裡需要分別啟動主從兩個容器 Master(主): Slave(從): Master對外映射的埠是3339,Slave對外映射的埠是3340。因為docker容器是相互獨立的, ...
  • 最近需要基於linux文件系統的擴展屬性,做一些自定義的操作;在這裡對調研過程進行簡要記錄;我們常見的很多服務如glusterfs 等,都是使用文件擴展屬性做一些定製化的操作; 擴展屬性(xattrs)提供了一種機制,用來將鍵值對永久得關聯到文件;讓現有的文件系統得以支持在原始設計中未提供的功能。擴 ...
  • 承接記憶體管理相關概念講解相關數據結構。主要有 pg_data_t: 表示節點; zone: 記憶體域; page: 頁幀; pglist_data定義如下: node_zones是一個數組,包含節點中各記憶體域(ZONE_DMA, ZONE_DMA32, ZONE_NORMAL...)的數據結構; no ...
  • 在直接記憶體回收過程中,有可能會造成當前需要分配記憶體的進程被加入一個等待隊列,當整個node的空閑頁數量滿足要求時,由kswapd喚醒它重新獲取記憶體。這個等待隊列頭就是node結點描述符pgdat中的pfmemalloc_wait。如果當前進程加入到了 這個等待隊列中,那麼進程就不會進行直接記憶體回收, ...
  • 錄製終端視頻 [root@localhost ~]# asciinema rec first.cast [root@localhost ~]# asciinema rec /www/wwwroot/first.cast # rec後面跟錄製文件的保存位置 [root@localhost ~]# as ...
  • ubuntu18.04離線 安裝jdk8環境 下載離線安裝包 Jdk oracle官方下載地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8 downloads 2133151.html 解壓 習慣上會將解壓後的文件放在/ ...
  • 一 統一日誌管理 1.1 日誌管理 在Kubernetes集群環境中,一個完整的應用或服務都會涉及為數眾多的組件運行,各組件所在的Node及實例數量都是可變的。日誌子系統如果不做集中化管理,則會給系統的運維支撐造成很大的困難,因此建議在集群層面對日誌進行統一收集和檢索等工作。 在容器中輸出到控制台的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...