MySQL主鍵的理解
MySQL主鍵的理解
主鍵(primary key )沒有著明確的概念定義,其是索引的一種,並且是唯一性索引的一種,且必須定義為“PRIMARY KEY”,主鍵不能重複,一個表只能有一個主鍵。
Mysql中規定自增列必須為主鍵,在插入時,如果自動增長列沒有輸入值,則插入的值為自動增長後的值;如果輸入的值為0或者null,則插入的值也為自動增長後的值;如果插入某個確定的值,且該值在前面沒有出現過,則可以直接插入。
1. 主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵。
所謂主鍵就是能夠唯一標識表中某一行的屬性或屬性組,一個表只能有一個主鍵,但可以有多個候選索引。因為主鍵可以唯一標識某一行記錄,所以可以確保執行資料更新、刪除的時候不會出現張冠李戴的錯誤。主鍵除了上述作用外,常常與外來鍵構成參照完整性約束,防止出現資料不一致。資料庫在設計時,主鍵起到了很重要的作用。
主鍵可以保證記錄的唯一和主鍵域非空,資料庫管理系統對於主鍵自動生成唯一索引,所以主鍵也是一個特殊的索引。
2. 一個表中可以有多個唯一性索引,但只能有一個主鍵。
3. 主鍵列不允許空值,而唯一性索引列允許空值。
4. 索引可以提高查詢的速度。
其實主鍵和索引都是鍵,不過主鍵是邏輯鍵,索引是物理鍵,意思就是主鍵不實際存在,而索引實際存在在資料庫中,主鍵一般都要建,主要是用來避免一張表中有相同的記錄,索引一般可以不建,但如果需要對該表進行查詢操作,則最好建,這樣可以加快檢索的速度。
1、宣告主鍵的方法:
您可以在建立表的時候就為表加上主鍵,如:
CREATE TABLE tbl_name ([欄位描述省略...], PRIMARY KEY(index_col_name));
也可以更新表結構時為表加上主鍵,如:
ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,…);
/*
建立一個qq表,將qq_id設為主鍵,且沒有對其進行NOT NULl約束
*/
create table qq(
qq_id int(10),
nick_name varchar(255) not null,
primary key (qq_id))
/*
插入一條資料,將qq號設為10000(我們也幻想一下),暱稱設為"simaopig"
*/
INSERT INTO qq( qq_id, nick_name )
VALUES (
'10000', 'simaopig');
2、示例
主鍵被認為是NOT NULL和UNIQUE約束最好的結合。如果這些列沒有被明確地定義為NOT NULL,MySQL會隱含地定義這些列。
3、主鍵也是索引:
剛才已經說了,主鍵其實也是索引,甚至在MySQL的術語裡面“鍵”就等於“索引”,所以“外來鍵”一定要先設為“索引”。所以主鍵也應該和索引一樣,既可以作用於單獨的欄位,又可以作用於多個欄位。
舉個簡的例子吧,我住3單元,501室,我叫小小子,那麼只有3單元501室才能在本小區表裡面唯一確定我家。因為2單元,501室住著的可能也是個小小子,所以只有兩個欄位才能唯一確定我,也就是說可以二者組合作為主鍵。組合的主鍵,每個列都會隱含定義NOT NULL約束,且其二者加在一起被定義了UNIQUE 惟一約束。
/*
建立防火牆表,將host 和port組合設為主鍵,注意我沒有將port設NOT NULL約束
*/
create table firewall(
host varchar(11) not null,
port smallint(4),
access enum('deny', 'allow') not null,
primary key (host,port))
/*
插入一條新的記錄,沒有啥問題
1 row(s) inserted.
*/
INSERT INTO firewall (
host ,
port ,
access)
VALUES (
'202.65.3.87', '21', 'deny');
相關文章
- MySQL 中的自增主鍵MySql
- SQLServer學習筆記 - 主鍵的理解SQLServer筆記
- MySQL新增自增主鍵的坑MySql
- 【Mysql】mysql主鍵的缺少導致備庫hangMySql
- mysql主從複製的理解和搭建MySql
- MYSQL 主鍵的那些 “有意思” 故事MySql
- MySQL 主鍵自增也有坑?MySql
- MySQL 缺少主鍵的表的效能下降的原因MySql
- Mysql關於自增主鍵,自增主鍵優化總結MySql優化
- 深入瞭解MySQL中的自增主鍵MySql
- MyBatis + MySQL返回插入成功後的主鍵idMyBatisMySql
- mysql主鍵的缺少導致備庫hangMySql
- MySQL 主鍵自增 Auto Increment用法MySqlREM
- mysql-刪除和新增主鍵MySql
- [精]mysql聯合主鍵應用MySql
- 向Mysql主鍵自增長表中新增資料並返回主鍵MySql
- 生產環境mysql主主同步主鍵衝突處理MySql
- 主鍵與主鍵索引的關係索引
- MYSQL INNODB主鍵使用varchar和int的區別MySql
- 【mycat】mycat中配合mysql自增主鍵的使用MySql
- MySQL8自增主鍵變化MySql
- MySQL自增主鍵跳號問題MySql
- mysql建表必須使用主鍵嗎MySql
- MySQL 8 新特性之自增主鍵的持久化MySql持久化
- Mysql分庫分表的主鍵生成演算法MySql演算法
- mysql裡alter table 重定義主鍵的步驟:MySql
- [MySQL]為什麼主鍵最好是有序遞增的MySql
- 主鍵local索引、unique local索引、分割槽索引順序的理解索引
- 深入理解Redis中的主鍵失效及其實現機制Redis
- Oracle主鍵與複合主鍵的效能分析Oracle
- MySQL 聚簇索引一定是主鍵嗎MySql索引
- MySQL 主鍵衝突,無法插入資料MySql
- MySQL5.5加主鍵鎖讀問題MySql
- MySQL 預設排序真的是按主鍵來排序的嗎MySql排序
- MySQL的主鍵和欄位型別問題總結MySql型別
- MySQL 資料庫自增主鍵生成的優缺點MySql資料庫
- MySQL的主從複製與MySQL的主主複製MySql
- MySQL 處理插入過程中的主鍵唯一鍵重複值辦法MySql