首頁 > 軟體

MySql約束超詳細介紹

2022-09-16 22:04:17

1. 什麼是約束

約束對應的英語單詞:constraint

在建立表的時候,我們可以給表中的欄位加上一些約束,來保證表中的資料的完整性、有效性!!!

約束的作用就是為了保證:表中的資料有效!!

2. 約束包括哪些

非空約束 not null

唯一性約束 unique

主鍵約束 primary key

外來鍵約束 foreign key

檢查約束 check

3. 非空約束

非空約束 not null 約束的欄位不能為 NULL

mysql> create table t_vip(id int, name varchar(255) not null);

mysql> insert into t_vip(id, name) values(1, 'zhangsan');
mysql> insert into t_vip(id, name) values(2, 'lisi');

mysql> insert into t_vip(id) values(3);
ERROR 1364 (HY000): Field 'name' doesn't have a default value

4. 唯一性約束

唯一性約束 unique 約束的欄位不能重複,但是可以為 NULL

1. 單欄位唯一性約束

mysql> create table t_vip(id int, name varchar(255) unique, email varchar(255));

mysql> insert into t_vip(id, name, email) values(3, 'lisi', 'lisi@123.com');
ERROR 1062 (23000): Duplicate entry 'lisi' for key 't_vip.name'
mysql> select * from t_vip;

2. 多欄位唯一性約束

需求:name 和 email 兩個欄位聯合起來具有唯一性!!!

mysql> create table t_vip(id int, name varchar(255) unique, email varchar(255) unique);

這樣建立的表是不符合上述需求的,因為 name 具有唯一性,email 具有唯一性。兩個欄位各自具有唯一性。

mysql> create table t_vip(id int, name varchar(255), email varchar(255), unique(name, email));
mysql> insert into t_vip(id, name, email) values(1, 'zhangsan', 'zhangsan@123.com');
mysql> insert into t_vip(id, name, email) values(1, 'zhangsan', 'zhangsan@sina.com');

5. 主鍵約束

主鍵約束 primary key 簡稱 pk

1. 主鍵約束的相關術語

  1. 主鍵約束:就是一種約束。
  2. 主鍵欄位:該欄位上新增了主鍵約束,這樣的欄位叫做:主鍵欄位。
  3. 主鍵值:主鍵欄位中的每一個值都叫做:主鍵值。

2. 什麼是主鍵以及有啥用

主鍵值是每一行記錄的唯一標識

主鍵值是每一行記錄的身份證號!!!

記住:任何一張表都應該有主鍵,沒有主鍵,表無效!!!

主鍵的特徵:not null + unique(主鍵值不能是 NULL,同時也不能重複)

3. 單一主鍵

mysql> create table t_vip(id int primary key, name varchar(255));

主鍵不能重複

mysql> insert into t_vip(id, name) values(2, 'lisi');
ERROR 1062 (23000): Duplicate entry '2' for key 't_vip.PRIMARY'

主鍵不能為NULL

mysql> insert into t_vip(name) values('lisi');
ERROR 1364 (HY000): Field 'id' doesn't have a default value

4. 複合主鍵

mysql> create table t_vip(id int, name varchar(255), email varchar(255), primary key(id, name));

mysql> insert into t_vip(id, name, email) values(1, 'zhangsan', 'zhansgan@123.com');
mysql> insert into t_vip(id, name, email) values(1, 'lisi', 'lisi@123.com');

5. 其他主鍵

除了單一主鍵和複合主鍵外,還擁有:

  • 自然主鍵:主鍵值是一個自然數,和業務沒有關係。
  • 業務主鍵:主鍵值和業務緊密關聯,例如拿銀行卡賬號做主鍵值。這就是業務主鍵!

實際開發中,使用自然主鍵多,很少使用業務主鍵!!!

主鍵一旦和業務值掛鉤,可能會出現各種問題!!!

6. 外來鍵約束

外來鍵頁數 foregin key 簡稱 fk

1. 外來鍵約束的相關術語

  1. 外來鍵約束:一種約束:foregin key。
  2. 外來鍵欄位:該欄位上新增了外來鍵約束。
  3. 外來鍵值:外來鍵欄位當中的每一個值。

2. 外來鍵出現的原因

業務背景:

請設計資料庫表,來描述 “班級和學生” 的資訊?

第一種方案:班級和學生儲存在一張表中

分析上述方案的缺點:資料冗餘,空間浪費!!!

第二種方案:班級一張表,學生一張表

當 cno 欄位沒有任何約束的時候,可能會導致資料無效。可能出現一個 102,但是 102 班級不存在,所以為了保證 cno 欄位中的值都是 100 和 101,需要給 cno 欄位新增外來鍵約束。 那麼:cno 欄位就是外來鍵欄位。cno 欄位中的每一個值都是外來鍵值。

注意:

t_class 是父表 t_student 是字表

刪除表的順序?

先刪子,再刪父。

建立表的順序?

先建立父,再建立子。

刪除資料的順序?

先刪子,再刪父。

插入資料的順序?

先插入父,再插入子。

3. 建立外來鍵表

建立表

mysql> create table t_class(classno int primary key, classname varchar(255));
mysql> create table t_student(no int primary key auto_increment, name varchar(255), cno int, foreign key(cno) references t_class(classno));

插入資料

mysql> insert into t_class(classno, classname) values(100, '北京市大興區亦莊鎮第二中學高三1班');
mysql> insert into t_class(classno, classname) values(101, '北京市大興區亦莊鎮第二中學高三2班');

mysql> insert into t_student(name, cno) values('jack', 100);
mysql> insert into t_student(name, cno) values('lucy', 100);
mysql> insert into t_student(name, cno) values('lilei', 100);
mysql> insert into t_student(name, cno) values('hanmeimei', 100);
mysql> insert into t_student(name, cno) values('zhangsan', 100);
mysql> insert into t_student(name, cno) values('lisi', 100);
mysql> insert into t_student(name, cno) values('wangwu', 100);
mysql> insert into t_student(name, cno) values('zhaoliu', 100);

注意:子表中的外來鍵參照的父表中的某個欄位,被參照的這個欄位必須是主鍵嗎?

不一定是主鍵,但至少具有 unique 約束。

到此這篇關於MySql約束超詳細介紹的文章就介紹到這了,更多相關MySql約束內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com