1. 程式人生 > >linux 之mysql——約束(constraint)詳解

linux 之mysql——約束(constraint)詳解

一、什麼是約束

約束英文:constraint 約束實際上就是表中資料的限制條件

二、約束作用

表在設計的時候加入約束的目的就是為了保證表中的記錄完整和有效性

比如name欄位中要讓其使用者名稱不重複,這就需要新增約束。或者必須註冊的時候需要新增郵箱等 

三、約束種類

非空約束(not null)

 唯一性約束(unique)

主鍵約束(primary key) PK

外來鍵約束(foreign key) FK

四、非空約束

用not null約束的欄位不能為null值,必須給定具體的資料 

建立表,給欄位新增非空約束(建立使用者表,使用者名稱不能為空)

mysql> create table t_user(
    -> id int(10),
    -> name varchar(32) not null
    -> );
Query OK, 0 rows affected (0.08 sec)

如果沒有插入name欄位資料,則會報錯

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

五、唯一性約束

unique約束的欄位,具有唯一性,不可重複,但可以為null

建立表,保證郵箱地址唯一(列級約束)

mysql> create table t_user(
    -> id int(10),
    -> name varchar(32) not null,
    -> email varchar(128) unique
    -> );
Query OK, 0 rows affected (0.03 sec)

表級約束 

mysql> create table t_user(
    -> id int(10),
    -> name varchar(32) not null,
    -> email varchar(128),
    -> unique(email)
    -> );

如果插入相同email會報錯

mysql> insert into t_user(id,name,email) values(1,'xlj','[email protected]');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_user(id,name,email) values(2,'jay','[email protected]');
ERROR 1062 (23000): Duplicate entry '[email protected]' for key 'email'

六、主鍵約束(primary key)PK

表設計時一定要有主鍵

1、主鍵涉及術語

主鍵約束 主鍵欄位 主鍵值

2、以上三種術語關係 表中的某個欄位新增主鍵約束後,該欄位為主鍵欄位,主鍵欄位中出現的每一個數據都稱為主鍵值

3、主鍵約束與“not null unique”區別 給某個欄位新增主鍵約束之後,該欄位不能重複也不能為空,效果和”not null unique”約束相同,但是本質不同。 主鍵約束除了可以做到”not null unique”之外,還會預設新增”索引——index”

4、一張表應該有主鍵欄位,如果沒有,表示該表無效 主鍵值:是當前行資料的唯一標識、是當前行資料的身份證號 即使表中兩行記錄相關資料相同,但由於主鍵值不同,所以也認為是兩行不同的記錄

5、按主鍵約束的欄位數量分類 無論是單一主鍵還是複合主鍵,一張表主鍵約束只能有一個(約束只能有一個,但可以作用到好幾個欄位)

單一主鍵:給一個欄位新增主鍵約束

複合主鍵:給多個欄位聯合新增一個主鍵約束(只能用表級定義)

單一主鍵(列級定義) 

mysql> create table t_user(
    -> id int(10) primary key,
    -> name varchar(32)
    -> );
Query OK, 0 rows affected (0.07 sec)

複合主鍵(表級定義) 

mysql> create table t_user(
    -> id int(10),
    -> name varchar(32) not null,
    -> email varchar(128) unique,
    -> primary key(id,name)
    -> );
Query OK, 0 rows affected (0.05 sec)

新增主鍵約束:

設定myself表的age為主鍵

alter table myself add primary key(age);

語法:alter  table 表名 add primary key;

修改主鍵約束:

將id設定為主鍵 

alter table myself modify id int primary key;

語法:alter table 表名 modify 列名稱  列型別 primary key;

刪除主鍵約束:

 alter table myself drop primary key; 

語法:alter table 表名 drop primary key; 

6、在MySQL資料庫提供了一個自增的數字,專門用來自動生成主鍵值,主鍵值不用使用者維護,自動生成,自增數從1開始,以1遞增(auto_increment) 

mysql> create table t_user(
    -> id int(10) primary key auto_increment,
    -> name varchar(32) not null
    -> );
Query OK, 0 rows affected (0.03 sec)

插入兩行記錄,id主鍵值會自動增加

mysql> insert into t_user(name) values('jay');
Query OK, 1 row affected (0.04 sec)

mysql> insert into t_user(name) values('man');
Query OK, 1 row affected (0.00 sec)


mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
|  1 | jay  |
|  2 | man  |
+----+------+
2 rows in set (0.00 sec)

七、外來鍵約束(foreign key)FK

只能是表級定義(如以下例子)

新增外來鍵約束:設定本表的cno為外來鍵 

alter table myself add foreign key classno references t_class(cno)

語法:alter table 表名稱 add foreign key (列名稱)  references  關聯表名稱(列名稱);

外來鍵刪除: 

alter table myself drop foreign key myself_ibfk_1; 

語法:alter table 表名稱 drop foreign key 外來鍵名稱;   #外來鍵名和外來鍵名稱不一樣

查詢外來鍵名:

查詢myself外來鍵名

show create table myself 

1 什麼是外來鍵 若有兩個表A、B,id是A的主鍵,而B中也有id欄位,則id就是表B的外來鍵,外來鍵約束主要用來維護兩個表之間資料的一致性。 A為基本表,B為資訊表 1、外來鍵涉及到的術語 外來鍵約束 外來鍵欄位 外來鍵值

2、外來鍵約束、外來鍵欄位、外來鍵值之間的關係 某個欄位新增外來鍵約束之後,該欄位稱為外來鍵欄位,外來鍵欄位中每個資料都是外來鍵值

3、按外來鍵約束的欄位數量分類 單一外來鍵:給一個欄位新增外來鍵約束 複合外來鍵:給多個欄位聯合新增一個外來鍵約束

4、一張表可以有多個外來鍵欄位(與主鍵不同) 

建立兩個表,學生表,和班級表

學生表(新增單一外來鍵)

sno(pk)     sname       classno(fk)
1           jack        100
2           lucy        100
3           king        200

班級表 

cno(pk)     cname
100         1
200         2

為了保證學生表中的classno欄位中的資料必須來自於班級表中的cno欄位中的資料,有必要給學生表中的classno欄位新增外來鍵約束 

 

注意要點:

外來鍵值可以為null

外來鍵欄位去引用一張表的某個欄位的時候,被引用的欄位必須具有unique約束

有了外來鍵引用之後,表分為父表和子表

班級表:父表

學生表:子表

建立先建立父表 刪除先刪除子表資料

插入先插入父表資料

儲存學生班級資訊 

mysql> create table t_class(
    -> cno int(10) primary key,
    -> cname varchar(128) not null unique
    -> );

mysql> create table t_student(
    -> sno int(10) primary key auto_increment,
    -> sname varchar(32) not null,
    -> classno int(3),
    -> foreign key(classno) references t_class(cno)
    -> );

mysql> insert into t_class(cno,cname) values(100,'aaaaaaxxxxxx');
mysql> insert into t_class(cno,cname) values(200,'oooooopppppp');
mysql> insert into t_student(sname,classno) values('jack',100);
mysql> insert into t_student(sname,classno) values('lucy',100);
mysql> insert into t_student(sname,classno) values('king',200);

上表中找出每個學生的班級名稱

mysql> select s.*,c.* from t_student s join t_class c on s.classno=c.cno;
+-----+-------+---------+-----+--------------+
| sno | sname | classno | cno | cname        |
+-----+-------+---------+-----+--------------+
|   1 | jack  |     100 | 100 | aaaaaaxxxxxx |
|   2 | lucy  |     100 | 100 | aaaaaaxxxxxx |
|   3 | king  |     200 | 200 | oooooopppppp |
+-----+-------+---------+-----+--------------+

刪除表時有兩種模式:

on delete cascade  級聯刪除

 alter table students add constraint mage_stu_class_fk foreign key (classid) references classes (classid) on delete cascade;

外來鍵的級聯刪除:如果父表中的記錄被刪除,則子表中對應的記錄自動被刪除

父表——被外來鍵引用的表

子表——引用父表中的健作為外健的表

on delete set null  表的關聯列的值設定為null 

alter table students add constraint mage_stu_class_fk foreign key (classid) references classes (classid) on delete set null;

這種方式建立的外來鍵約束,當被參照的資料被刪除是,參照該資料的那些資料的對應值將會變為空值