一文徹底搞清楚MySQL的主鍵、外鍵、約束和各種索引
1. 主鍵
主鍵是一種用于唯一標(biāo)識(shí)表中每一行數(shù)據(jù)的標(biāo)識(shí)符。在Mysql中,主鍵可以是一個(gè)或多個(gè)列的組合,但是必須滿足以下條件:
- 主鍵列的值必須唯一,不能重復(fù)。
- 主鍵列的值不能為空,不能為NULL。
- 一個(gè)表只能有一個(gè)主鍵。
主鍵可以用于加速查詢和提高數(shù)據(jù)的完整性和安全性。在Mysql中,主鍵可以通過以下兩種方式定義:
1.1. 在創(chuàng)建表時(shí)定義主鍵
在創(chuàng)建表時(shí),可以通過在列定義后面添加PRIMARY KEY關(guān)鍵字來定義主鍵。例如:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,id列被定義為主鍵。
1.2. 在已有表中添加主鍵
在已有表中添加主鍵,可以使用ALTER TABLE語句。例如:
ALTER TABLE `users` ADD PRIMARY KEY (`id`);
2. 外鍵
外鍵是一種用于建立表與表之間關(guān)聯(lián)關(guān)系的機(jī)制。外鍵可以用于保證數(shù)據(jù)的完整性和一致性。在Mysql中,外鍵可以通過以下兩種方式定義:
2.1. 在創(chuàng)建表時(shí)定義外鍵
在創(chuàng)建表時(shí),可以通過在列定義后面添加FOREIGN KEY關(guān)鍵字來定義外鍵。例如:
CREATE TABLE `orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `product_id` int(11) NOT NULL, `quantity` int(11) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`user_id`) REFERENCES `users`(`id`), FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,orders表中的user_id和product_id列被定義為外鍵,分別引用了users表和products表中的id列。
2.2. 在已有表中添加外鍵
在已有表中添加外鍵,可以使用ALTER TABLE語句。例如:
3. 約束
約束是一種用于限制表中數(shù)據(jù)的規(guī)則。在Mysql中,約束可以用于保證數(shù)據(jù)的完整性和一致性。Mysql支持以下幾種約束:
3.1. NOT NULL約束
NOT NULL約束用于限制列中的數(shù)據(jù)不能為NULL。例如:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,name和email列被定義為NOT NULL。
3.2. UNIQUE約束
UNIQUE約束用于限制列中的數(shù)據(jù)不能重復(fù)。例如:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(50) NOT NULL UNIQUE, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,email列被定義為UNIQUE。
3.3. CHECK約束
CHECK約束用于限制列中的數(shù)據(jù)必須滿足指定的條件。例如:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `age` int(11) NOT NULL, CHECK (`age` >= 18), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,age列被定義為CHECK約束,要求age的值必須大于等于18。
3.4. DEFAULT約束
DEFAULT約束用于指定列的默認(rèn)值。例如:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, `status` tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,status列被定義為DEFAULT約束,如果插入數(shù)據(jù)時(shí)沒有指定status的值,則默認(rèn)為0。
4. 索引
索引是一種用于加速查詢的機(jī)制。在Mysql中,索引可以用于提高查詢效率和保證數(shù)據(jù)的完整性和一致性。Mysql支持以下幾種索引:
4.1. PRIMARY KEY索引
PRIMARY KEY索引是一種用于唯一標(biāo)識(shí)表中每一行數(shù)據(jù)的索引。在Mysql中,每個(gè)表只能有一個(gè)PRIMARY KEY索引。例如:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,id列被定義為PRIMARY KEY索引。
4.2. UNIQUE索引
UNIQUE索引是一種用于限制列中的數(shù)據(jù)不能重復(fù)的索引。在Mysql中,每個(gè)表可以有多個(gè)UNIQUE索引。例如:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(50) NOT NULL UNIQUE, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,email列被定義為UNIQUE索引。
4.3. INDEX索引
INDEX索引是一種用于加速查詢的索引。在Mysql中,每個(gè)表可以有多個(gè)INDEX索引。例如:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, INDEX `idx_name` (`name`), INDEX `idx_email` (`email`), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,name和email列被定義為INDEX索引。
4.4. FULLTEXT索引
FULLTEXT索引是一種用于全文搜索的索引。在Mysql中,每個(gè)表只能有一個(gè)FULLTEXT索引。例如:
CREATE TABLE `articles` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(50) NOT NULL, `content` text NOT NULL, FULLTEXT INDEX `idx_content` (`content`), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的例子中,content列被定義為FULLTEXT索引。
5. 總結(jié)
本文介紹了Mysql中主鍵、外鍵、約束和索引的概念和用法。在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體情況選擇合適的主鍵、外鍵、約束和索引,以提高數(shù)據(jù)的完整性和一致性,加速查詢。
以上就是一文徹底搞清楚MySQL的主鍵、外鍵、約束和各種索引的詳細(xì)內(nèi)容,更多關(guān)于MySQL主鍵、外鍵、約束和索引的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mysql中Table ‘XXX’ is marked as crashed and last (automatic?)
這篇文章主要介紹了Mysql中Table ‘XXX’ is marked as crashed and last (automatic?)問題解決方法,需要的朋友可以參考下2014-05-05簡單了解MySQL數(shù)據(jù)庫優(yōu)化技巧
這篇文章主要介紹了簡單了解MySQL數(shù)據(jù)庫優(yōu)化技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

Mysql Error Code : 1436 Thread stack overrun

mysql數(shù)據(jù)庫設(shè)置utf-8編碼的方法步驟