這篇文章主要講解了“主鍵的定義和用法”,文中的講解內容簡(jiǎn)單清晰,易于學(xué)習與理解,下面請大家跟著(zhù)小編的思路慢慢深入,一起來(lái)研究和學(xué)習“MySQL主鍵的定義和用法”吧!
主鍵沒(méi)有著(zhù)明確的概念定義,其是索引的一種,并且是唯一性索引的一種,且必須定義為“PRIMARY KEY”,是只可意會(huì )不可言傳的東西。下面讓我用通俗,甚至有些低俗的語(yǔ)言為您簡(jiǎn)單介紹一下MySQL的主鍵。
簡(jiǎn)單描述:
主鍵不能重復,就像QQ的用戶(hù)名,有N個(gè)叫“蟲(chóng)zi”的網(wǎng)友,可是他們的QQ號碼是不一樣的,也就是說(shuō)真正標識一個(gè)QQ的身份是“QQ號碼”。還有那萬(wàn)惡的身份證,無(wú)論“張三,李四,王二麻子”這些都不能代表一個(gè)人,真正能代表一個(gè)人確切身份的就是那個(gè)“天朝特色的萬(wàn)惡的身份證”,相當于在殺豬的時(shí)候給豬蓋個(gè)章,說(shuō)這頭是檢驗過(guò)的,有身份的豬,只不過(guò)人是生下來(lái)用“證”給你確定了,雖然要18歲才給你頒發(fā)。
不過(guò)主鍵和QQ號不一樣,因為一個(gè)表只能有一個(gè)主鍵,而一個(gè)人可以有多個(gè)QQ號,這也是為什么人們喜歡在虛擬世界里面互相忽悠,因為你真的不知道電腦那面坐的是一頭豬。
貌似扯的有點(diǎn)遠了,接著(zhù)來(lái)看我們的mysql主鍵。
聲明主鍵的方法:
您可以在創(chuàng )建表的時(shí)候就為表加上主鍵,如:
CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name));
也可以更新表結構時(shí)為表加上主鍵,如:
ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,…);
主鍵示例:
主鍵被認為是NOT NULL和UNIQUE約束最好的結合。如果這些列沒(méi)有被明確地定義為NOT NULL,MySQL會(huì )隱含地定義這些列。
/*
創(chuàng )建一個(gè)qq表,將qq_id設為主鍵,且沒(méi)有對其進(jìn)行NOT NULl約束
*/
create table qq(
qq_id int(10),
nick_name varchar(255) not null,
primary key (qq_id)
)
/*
插入一條數據,將qq號設為10000(咱也幻想一下),昵稱(chēng)設為"simaopig"
*/
INSERT INTO qq( qq_id, nick_name )
VALUES (
'10000', 'simaopig'
);
/*
插入一條數據,qq號仍為10000,因為數據庫內已經(jīng)存在其10000這樣的數據,
而且最最主要的是其QQ號為主鍵,所以報錯,信息如下
#1062 - Duplicate entry '10000' for key 'PRIMARY'
*/
INSERT INTO qq( qq_id, nick_name )
VALUES (
'10000', 'chongpig'
)
/*
雖然沒(méi)有將qq號字段設NOT NULL約束,可是因為其是主鍵,所以其不能為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ǔ)里面“鍵”就等于“索引”,所以“外鍵”一定要先設為“索引”,這個(gè)咱們下篇日志再來(lái)討論。所以主鍵也應該和索引一樣,既可以作用于單獨的字段,又可以作用于多個(gè)字段。
舉個(gè)簡(jiǎn)的例子吧,我住3單元,501室,我叫小小子,那么只有3單元501室才能在本小區表里面唯一確定我家。因為2單元,501室住著(zhù)的可能也是個(gè)小小子,所以只有兩個(gè)字段才能唯一確定我,也就是說(shuō)可以二者組合作為主鍵。組合的主鍵,每個(gè)列都會(huì )隱含定義NOT NULL約束,且其二者加在一起被定義了UNIQUE 惟一約束。
例子不寫(xiě)自己想的了,書(shū)中舉的例子更是恰當,那就是一個(gè)防火墻,由host和port組合確定一個(gè)防火墻。代碼示例如下:
/*
創(chuàng )建防火墻表,將host 和port組合設為主鍵,注意我沒(méi)有將port設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'
);
/*
插入失敗,因為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都可以重復,但是不能同時(shí)重復,因為其是組合主鍵。且二者都不能被插入NULL,因為其是主鍵。
我們可以看一下phpmyadmin,看一下port字段的默認值為0,這和昨天我們講的索引規則是一樣的,NOT NULL并且給設了DEFAULT,因其是整型所以為0,如果其為字符串的話(huà),默認值就是”
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站