共計(jì) 2408 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。
這篇文章主要講解了“MySQL 主鍵的定義和用法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著丸趣 TV 小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“MySQL 主鍵的定義和用法”吧!
主鍵沒(méi)有著明確的概念定義,其是索引的一種,并且是唯一性索引的一種,且必須定義為“PRIMARY KEY”,是只可意會(huì)不可言傳的東西。下面讓我用通俗,甚至有些低俗的語(yǔ)言為您簡(jiǎn)單介紹一下 MySQL 的主鍵。
簡(jiǎn)單描述:
主鍵不能重復(fù),就像 QQ 的用戶名,有 N 個(gè)叫“蟲(chóng) zi”的網(wǎng)友,可是他們的 QQ 號(hào)碼是不一樣的,也就是說(shuō)真正標(biāo)識(shí)一個(gè) QQ 的身份是“QQ 號(hào)碼”。還有那萬(wàn)惡的身份證,無(wú)論“張三,李四,王二麻子”這些都不能代表一個(gè)人,真正能代表一個(gè)人確切身份的就是那個(gè)“天朝特色的萬(wàn)惡的身份證”,相當(dāng)于在殺豬的時(shí)候給豬蓋個(gè)章,說(shuō)這頭是檢驗(yàn)過(guò)的,有身份的豬,只不過(guò)人是生下來(lái)用“證”給你確定了,雖然要 18 歲才給你頒發(fā)。
不過(guò)主鍵和 QQ 號(hào)不一樣,因?yàn)橐粋€(gè)表只能有一個(gè)主鍵,而一個(gè)人可以有多個(gè) QQ 號(hào),這也是為什么人們喜歡在虛擬世界里面互相忽悠,因?yàn)槟阏娴牟恢离娔X那面坐的是一頭豬。
貌似扯的有點(diǎn)遠(yuǎn)了,接著來(lái)看我們的 mysql 主鍵。
聲明主鍵的方法:
您可以在創(chuàng)建表的時(shí)候就為表加上主鍵,如:
CREATE TABLE tbl_name ([字段描述省略 …], PRIMARY KEY(index_col_name));
也可以更新表結(jié)構(gòu)時(shí)為表加上主鍵,如:
ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,…);
主鍵示例:
主鍵被認(rèn)為是 NOT NULL 和 UNIQUE 約束最好的結(jié)合。如果這些列沒(méi)有被明確地定義為 NOT NULL,MySQL 會(huì)隱含地定義這些列。
/*
創(chuàng)建一個(gè) qq 表,將 qq_id 設(shè)為主鍵,且沒(méi)有對(duì)其進(jìn)行 NOT NULl 約束
*/
create table qq(
qq_id int(10),
nick_name varchar(255) not null,
primary key (qq_id)
)
/*
插入一條數(shù)據(jù),將 qq 號(hào)設(shè)為 10000(咱也幻想一下),昵稱(chēng)設(shè)為 simaopig
*/
INSERT INTO qq( qq_id, nick_name )
VALUES (
10000 , simaopig
);
/*
插入一條數(shù)據(jù),qq 號(hào)仍為 10000,因?yàn)閿?shù)據(jù)庫(kù)內(nèi)已經(jīng)存在其 10000 這樣的數(shù)據(jù),
而且最最主要的是其 QQ 號(hào)為主鍵,所以報(bào)錯(cuò),信息如下
#1062 – Duplicate entry 10000 for key PRIMARY
*/
INSERT INTO qq( qq_id, nick_name )
VALUES (
10000 , chongpig
)
/*
雖然沒(méi)有將 qq 號(hào)字段設(shè) NOT NULL 約束,可是因?yàn)槠涫侵麈I,所以其不能為 NULL
#1048 – Column qq_id cannot be null
*/
INSERT INTO qq( qq_id, nick_name )
VALUES (
NULL , chongpig
)
主鍵也是索引:
剛才已經(jīng)說(shuō)了,主鍵其實(shí)也是索引,甚至在 MySQL 的術(shù)語(yǔ)里面“鍵”就等于“索引”,所以“外鍵”一定要先設(shè)為“索引”,這個(gè)咱們下篇日志再來(lái)討論。所以主鍵也應(yīng)該和索引一樣,既可以作用于單獨(dú)的字段,又可以作用于多個(gè)字段。
舉個(gè)簡(jiǎn)的例子吧,我住 3 單元,501 室,我叫小小子,那么只有 3 單元 501 室才能在本小區(qū)表里面唯一確定我家。因?yàn)?2 單元,501 室住著的可能也是個(gè)小小子,所以只有兩個(gè)字段才能唯一確定我,也就是說(shuō)可以二者組合作為主鍵。組合的主鍵,每個(gè)列都會(huì)隱含定義 NOT NULL 約束,且其二者加在一起被定義了 UNIQUE 惟一約束。
例子不寫(xiě)自己想的了,書(shū)中舉的例子更是恰當(dāng),那就是一個(gè)防火墻,由 host 和 port 組合確定一個(gè)防火墻。代碼示例如下:
/*
創(chuàng)建防火墻表,將 host 和 port 組合設(shè)為主鍵,注意我沒(méi)有將 port 設(shè) NOT NULL 約束
*/
create table firewall(
host varchar(11) not null,
port smallint(4),
access enum(deny , allow) not null,
primary key (host,port)
)
/*
插入一條新的記錄,沒(méi)有啥問(wèn)題
1 row(s) inserted.
*/
INSERT INTO firewall (
host ,
port ,
access
)
VALUES (
202.65.3.87 , 21 , deny
);
/*
插入失敗,因?yàn)?host 加 port 的主鍵值 202.65.3.87-21 已經(jīng)存在了
#1062 – Duplicate entry 202.65.3.87-21 for key PRIMARY
*/
INSERT INTO firewall (
host ,
port ,
access
)
VALUES (
202.65.3.87 , 21 , allow
);
/*
沒(méi)聲明 NOT NULl port 也不能為 NULL
#1048 – Column port cannot be null
*/
INSERT INTO firewall( host, port, access )
VALUES (
192.168.0.1 , NULL , deny
)
在這個(gè)示例中,host 和 port 都可以重復(fù),但是不能同時(shí)重復(fù),因?yàn)槠涫墙M合主鍵。且二者都不能被插入 NULL,因?yàn)槠涫侵麈I。
我們可以看一下 phpmyadmin,看一下 port 字段的默認(rèn)值為 0,這和昨天我們講的索引規(guī)則是一樣的,NOT NULL 并且給設(shè)了 DEFAULT,因其是整型所以為 0,如果其為字符串的話,默認(rèn)值就是”
感謝各位的閱讀,以上就是“MySQL 主鍵的定義和用法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì) MySQL 主鍵的定義和用法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!