一篇文章帶你了解MySQL數(shù)據(jù)庫約束
1. 約束類型
作用:
數(shù)據(jù)庫約束是用于限制數(shù)據(jù)輸入或數(shù)據(jù)更新的規(guī)則。數(shù)據(jù)庫約束確保在表中只能插入符合規(guī)則的數(shù)據(jù),以確保數(shù)據(jù)的完整性和一致性。
常見的數(shù)據(jù)庫約束包括:
- 主鍵約束:用于唯一標(biāo)識(shí)表中的每一行數(shù)據(jù),確保數(shù)據(jù)唯一性和完整性。
- 外鍵約束:用于確保表之間數(shù)據(jù)的關(guān)系正確性,保證引用表中的數(shù)據(jù)必須存在于被引用的表中。
- 非空約束:用于確保列中的值不為空。
- 唯一約束:用于確保列中的值不重復(fù)。
- 默認(rèn)約束:用于設(shè)置默認(rèn)值,當(dāng)插入數(shù)據(jù)時(shí)如果未提供該值,則數(shù)據(jù)庫將使用默認(rèn)值。
- 檢查約束:用于確保列中的值符合特定的條件或表達(dá)式。
- 觸發(fā)器約束:用于在特定情況下自動(dòng)執(zhí)行操作,如插入或刪除數(shù)據(jù)時(shí)執(zhí)行某項(xiàng)操作。
2.PRIMARY KEY:主鍵約束
概念:
主鍵約束是一種用于限制表中唯一標(biāo)識(shí)每行記錄的數(shù)據(jù)庫約束。主鍵約束可以確保表中每行的唯一性,并且可以作為其他表與該表之間關(guān)系的依據(jù)。每個(gè)表只能有一個(gè)主鍵約束,主鍵約束的值必須是唯一的且不為空。
主鍵約束可以在創(chuàng)建表時(shí)定義,也可以在已有表上添加。
舉例:
1.在創(chuàng)建一個(gè)名為"student"的表時(shí),可以給"id"列定義主鍵約束。
這個(gè)時(shí)候,當(dāng)我們添加元素的時(shí)候,id的值就必須唯一并且不為空。
>2.當(dāng)表已經(jīng)創(chuàng)建好,表中并沒有任何一列進(jìn)行主鍵約束,我們還可以通過下面這種方式進(jìn)行主鍵約束。
注意
這種約束方式并不如前者,而且當(dāng)想要約束的列,有null或者有重復(fù)元素的時(shí)候,會(huì)主鍵約束失敗。
上面用到的代碼:
mysql> create table student(id int primary key, name varchar(10)); Query OK, 0 rows affected (0.02 sec) mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(10) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> insert into values(null,'張三'); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(null,'張三')' at line 1 mysql> insert into student values(null,'張三'); ERROR 1048 (23000): Column 'id' cannot be null mysql> insert into student values('張三'); ERROR 1136 (21S01): Column count doesn't match value count at row 1 mysql> insert into student values(1,'張三'); Query OK, 1 row affected (0.01 sec) mysql> insert into student values(1,'李四'); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' mysql> insert into student values(2,'李四'); Query OK, 1 row affected (0.01 sec) mysql> select * from student; +----+------+ | id | name | +----+------+ | 1 | 張三 | | 2 | 李四 | +----+------+ 2 rows in set (0.00 sec)
3.FOREIGN KEY:外鍵約束
概念:
外鍵約束是一種用于保持表之間數(shù)據(jù)一致性的約束,它建立了兩個(gè)表之間的一對(duì)多關(guān)系。外鍵約束確保了一個(gè)表中的數(shù)據(jù)必須和另一個(gè)表中的數(shù)據(jù)相關(guān)聯(lián),否則就會(huì)觸發(fā)約束錯(cuò)誤。
外鍵約束也可以在創(chuàng)建表時(shí)定義或者在已有表上添加。
舉例:
外鍵約束也可以在創(chuàng)建表時(shí)定義或者在已有表上添加。
下圖定義了一個(gè)外鍵約束:
外鍵約束通常用于將兩個(gè)表之間建立一對(duì)多關(guān)系,上面圖中,student表中的class_id列是一個(gè)外鍵,它關(guān)聯(lián)到了class表中的id列。這個(gè)外鍵約束確保student表中的class_id列的值只能從class表中的id列中的值中選擇,如果沒有,則報(bào)錯(cuò)。
上面用到的代碼:
mysql> create table class(id int primary key, name varchar(10)); Query OK, 0 rows affected (0.01 sec) mysql> create table student(id int primary key, name varchar(20), class_id int, -> foreign key (class_id) references class(id)); Query OK, 0 rows affected (0.02 sec) mysql> desc student; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | class_id | int(11) | YES | MUL | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> insert into class values(1, '軟件工程'),(2, '計(jì)科'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into student values(20211,'張三',1); Query OK, 1 row affected (0.01 sec) mysql> insert into student values(20212,'李四',2); Query OK, 1 row affected (0.01 sec) mysql> insert into student values(20213,'王五',3); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`xiaoc`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
4.NOT NULL:非空約束
概念:
非空約束是一種用于確保列中的值不為空的約束。如果為某個(gè)列定義了非空約束,那么在插入或更新數(shù)據(jù)時(shí)必須為該列提供一個(gè)非空值,否則就會(huì)觸發(fā)非空約束錯(cuò)誤。
舉例:
在創(chuàng)建表時(shí),可以為某個(gè)列定義非空約束。
下面的代碼定義了一個(gè)名為student的表,其中的id列被定義為非空約束:
這個(gè)時(shí)候如果插入空的元素就會(huì)報(bào)錯(cuò)。
上面用到的代碼:
mysql> create table student(id int not null, name varchar(10)); Query OK, 0 rows affected (0.01 sec) mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(10) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.01 sec) mysql> insert into student values(1,'張三'); Query OK, 1 row affected (0.01 sec) mysql> insert into student values(null,'李四'); ERROR 1048 (23000): Column 'id' cannot be null mysql> insert into student values('李四');
5.UNIQUE:唯一約束
概念:
唯一約束是一種用于確保某個(gè)列中的值唯一的約束。如果為某個(gè)列定義了唯一約束,那么該列中的值必須是唯一的,不允許有重復(fù)值。唯一約束可以用于確保表中某一列或多列的組合中沒有重復(fù)值。
舉例:
在創(chuàng)建表時(shí),可以為某個(gè)列定義唯一約束。
下面的代碼定義了一個(gè)名為users的表,其中的email列被定義為唯一約束:
上述例子中,student表中的id列被定義為唯一約束,因此,任何向student表插入數(shù)據(jù)的操作,都必須確保id列中的值是唯一的。
上面用到的代碼:
mysql> create table student(id int unique,name varchar(20)); Query OK, 0 rows affected (0.02 sec) mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | UNI | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> insert into student values(1,'張三'); Query OK, 1 row affected (0.01 sec) mysql> insert into student values(2,'李四'); Query OK, 1 row affected (0.01 sec) mysql> insert into student values(2,'威威'); ERROR 1062 (23000): Duplicate entry '2' for key 'id'
5.DEFAULT:默認(rèn)值約束
概念:
默認(rèn)值約束是指在向表中插入新行時(shí),如果沒有為某個(gè)列指定具體的值,則該列會(huì)使用預(yù)定義的默認(rèn)值。默認(rèn)值可以是任何常量或表達(dá)式,例如字符串、數(shù)字、日期等。如果某個(gè)列定義了默認(rèn)值約束,則在執(zhí)行INSERT操作時(shí),如果沒有為該列指定具體值,則會(huì)自動(dòng)使用默認(rèn)值。
舉例:
在創(chuàng)建表時(shí),可以為某個(gè)列指定默認(rèn)值約束。例如,下面的代碼創(chuàng)建了一個(gè)名為student的表,其中的name列被定義為默認(rèn)值約束:
當(dāng)插入null.
上面用到的代碼:
mysql> create table student(id int, name varchar(10) default '陌路人'); Query OK, 0 rows affected (0.02 sec) mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(10) | YES | | 陌路人 | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> insert into student(id) values(1),(2); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into student values(3,'張三'); Query OK, 1 row affected (0.01 sec) mysql> select * from student; +------+--------+ | id | name | +------+--------+ | 1 | 陌路人 | | 2 | 陌路人 | | 3 | 張三 | +------+--------+ 3 rows in set (0.00 sec)
6.總結(jié)
數(shù)據(jù)庫約束是數(shù)據(jù)庫設(shè)計(jì)中的重要概念,它可以有效地保障數(shù)據(jù)的完整性、一致性、準(zhǔn)確性和安全性,幫助開發(fā)人員更好地管理和維護(hù)數(shù)據(jù),所以掌握約束還是非常重要的。
到此這篇關(guān)于一篇文章帶你了解MySQL數(shù)據(jù)庫約束的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)庫約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux下二進(jìn)制方式安裝mysql5.7版本和系統(tǒng)優(yōu)化的步驟
這篇文章主要介紹了Linux下二進(jìn)制方式安裝mysql5.7版本和系統(tǒng)優(yōu)化的步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01mysql 批處理文件出錯(cuò)后繼續(xù)執(zhí)行的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猰ysql 批處理文件出錯(cuò)后繼續(xù)執(zhí)行的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10修改Mysql索引長(zhǎng)度限制解決767?byte限制問題
這篇文章主要介紹了修改Mysql索引長(zhǎng)度限制解決767?byte限制問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03