基礎教程系列-約束(一)主鍵約束

一埠帕、什么是主鍵

主鍵(PRIMARY KEY)的又叫做“主鍵約束”媳瞪,MySQL 主鍵約束是一個單獨的列或者多個列的組合抑片,其值能唯一地標識表中的一行數(shù)據(jù)睹栖。這樣的一列或多列稱為表的主鍵硫惕,通過它可以強制表的實體完整性。

例如野来,通過某個人的身份證號碼可以唯一確定唯一一個人恼除,那這個身份證號就是主鍵。如果通過身份證號找到兩個人曼氛,但是兩個人的姓名不一樣豁辉。則通過”身份證號+姓名”可以確定唯一一個人,則”身份證號+姓名”的組合就是主鍵舀患。

二徽级、選取設置主鍵約束的字段

單獨一個列的主鍵可以叫做單列主鍵,或者就叫為主鍵聊浅。由多個列組合的主鍵稱為復合主鍵餐抢,例如”身份證號+姓名”確定唯一一條數(shù)據(jù)的情況就屬于一種復核主鍵。

主鍵應該遵守下面的規(guī)則:

  • 每個表只能定義一個主鍵低匙。

  • 遵循唯一性原則旷痕,主鍵值必須唯一標識表中的每一行數(shù)據(jù),且不能為 NULL顽冶,即表中不可能存在兩行數(shù)據(jù)有相同的主鍵值欺抗。

  • 一個列名只能在復合主鍵列表中出現(xiàn)一次。例如“身份證+姓名”為主鍵强重,而不能是”身份證+身份證+姓名”為主鍵绞呈。

  • 遵循最小化原則贸人,復合主鍵不能包含不必要的多余列,當把復合主鍵的某一列刪除后报强,如果剩下的列構(gòu)成的主鍵仍然滿足唯一性原則灸姊,那么這個復合主鍵是不正確的。這是最小化原則秉溉。

三力惯、重要注意事項

如果在建表的時候沒有主動設置主鍵,就會選一個不包含NULL的第一個唯一索引列作為主鍵列召嘶,并把它用作一個聚集索引(也叫聚簇索引)父晶。

如果沒有這樣的索引就會使用行號生成一個聚集索引(也叫聚簇索引),把它當做主鍵弄跌,這個行號長度為6 bytes甲喝,自增☆踔唬可以用select _rowid from table語句來查詢埠胖。

墻裂建議:每一個表都要明確設置主鍵,不要使用系統(tǒng)自動生成的主鍵淳玩,完全對系統(tǒng)開發(fā)沒有一點好處直撤,應該把這條規(guī)則作為強制開發(fā)約束。

四蜕着、設置主鍵的方法

  1. 第一種方法:在創(chuàng)建表時設置主鍵約束谋竖,在 CREATE TABLE 語句中,通過 PRIMARY KEY 關(guān)鍵字來指定承匣,在定義列的同時指定主鍵蓖乘,語法規(guī)則為:列名 列類型 PRIMARY KEY [默認值]

示例1,在 demo_db 數(shù)據(jù)庫中創(chuàng)建 demo_employee 3 數(shù)據(jù)表韧骗,其主鍵為 id嘉抒,測試SQL語句和執(zhí)行結(jié)果如下所示。

mysql> CREATE TABLE demo_employee3
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(25),
    -> deptid INT(11),
    -> salary FLOAT
    -> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC demo_employee3;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptid | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)
  1. 第二種方法:在定義完所有列之后宽闲,指定主鍵的語法格式為:[CONSTRAINT <約束名>] PRIMARY KEY [字段名]

示例2众眨,在 demo_db 數(shù)據(jù)庫中創(chuàng)建 demo_employee 4 數(shù)據(jù)表,其主鍵為 id容诬,測試SQL語句和執(zhí)行結(jié)果如下所示娩梨。

mysql> CREATE TABLE demo_employee4
    -> (
    -> id INT(11),
    -> name VARCHAR(25),
    -> deptid INT(11),
    -> salary FLOAT,
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC demo_employee4;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptid | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)

主鍵由多個字段聯(lián)合組成,語法規(guī)則如下:PRIMARY KEY [字段1览徒,字段2狈定,…,字段n]

示例3,創(chuàng)建數(shù)據(jù)表 demo_employee5,假設表中沒有主鍵 id纽什,為了唯一確定一個員工措嵌,可以把 name、deptid 聯(lián)合起來作為主鍵芦缰,測試SQL語句和執(zhí)行結(jié)果如下所示企巢。

mysql> CREATE TABLE demo_employee5
    -> (
    -> name VARCHAR(25),
    -> deptid INT(11),
    -> salary FLOAT,
    -> PRIMARY KEY(name,deptid)
    -> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC demo_employee5;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(25) | NO   | PRI | NULL    |       |
| deptid | int(11)     | NO   | PRI | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.14 sec)
  1. 在修改表時添加主鍵約束,語法規(guī)則為:ALTER TABLE <表名> ADD PRIMARY KEY(<列名>);

示例4让蕾,修改數(shù)據(jù)表 demo_employee2浪规,將字段 id 設置為主鍵,測試SQL語句和執(zhí)行結(jié)果如下所示探孝。

首先查看 demo_employee2 數(shù)據(jù)表的表結(jié)構(gòu)笋婿,如下所示,是沒有設置任何主鍵的顿颅。

mysql> DESC demo_employee2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| deptid | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)

然后使用ALTER語句修改表缸濒,同時增加主鍵

mysql> ALTER TABLE demo_employee2
    -> ADD PRIMARY KEY(id);
Query OK, 0 rows affected (0.94 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> DESC demo_employee2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| deptid | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.12 sec)

MySQL是日常工作中使用最對的數(shù)據(jù)庫之一,所以必須要要較為深入和全面的掌握粱腻,對于高階人員還要掌握分布式事務庇配、各種數(shù)據(jù)庫鎖、傳播機制等绍些。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讨永,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遇革,更是在濱河造成了極大的恐慌,老刑警劉巖揭糕,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝快,死亡現(xiàn)場離奇詭異,居然都是意外死亡著角,警方通過查閱死者的電腦和手機揪漩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏口,“玉大人奄容,你說我怎么就攤上這事〔玻” “怎么了昂勒?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舟铜。 經(jīng)常有香客問我戈盈,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任塘娶,我火速辦了婚禮归斤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刁岸。我一直安慰自己脏里,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布虹曙。 她就那樣靜靜地躺著迫横,像睡著了一般。 火紅的嫁衣襯著肌膚如雪根吁。 梳的紋絲不亂的頭發(fā)上员淫,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音击敌,去河邊找鬼介返。 笑死,一個胖子當著我的面吹牛沃斤,可吹牛的內(nèi)容都是我干的圣蝎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衡瓶,長吁一口氣:“原來是場噩夢啊……” “哼徘公!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哮针,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤关面,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后十厢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體等太,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年蛮放,在試婚紗的時候發(fā)現(xiàn)自己被綠了缩抡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡包颁,死狀恐怖瞻想,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娩嚼,我是刑警寧澤蘑险,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站待锈,受9級特大地震影響漠其,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一和屎、第九天 我趴在偏房一處隱蔽的房頂上張望拴驮。 院中可真熱鬧,春花似錦柴信、人聲如沸套啤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潜沦。三九已至,卻和暖如春绪氛,著一層夾襖步出監(jiān)牢的瞬間唆鸡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工枣察, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留争占,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓序目,卻偏偏與公主長得像臂痕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子猿涨,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容