MySQL筆記六:約束
阿新 • • 發佈:2022-04-10
在建立表的時候,可以給表中的資料加上一些約束,來保證這個表中的資料的完整性和準確性
約束包括:
not null非空約束
unique唯一性約束,不能重複,但是可以有多個null
primary key主鍵約束(簡稱PK)
foreign key外來鍵約束(簡稱FK)
check(MySQL不支援,oracle支援)
6.1 notnull
create table t_vip(
id int,
name varchar(32) not null
);
insert into t_vip(id) values(3);//會報錯,因為name限定不能為空
6.2 unique
create table_vip(
id int,
name varcahr(32) unique,//約束新增到列後面,被稱為列級約束
email varchar(255)
);
insert ito t_vip(id,name,email) values (1,'wang','2343');
insert ito t_vip(id,name,email) values (2,'wang','1343');//報錯
6.3 unique兩個欄位聯合起來具有唯一性
create table_vip(
id int,
name varcahr(32),
email varchar(255),
unique(name,email)//約束沒有新增到列的後面,稱為表級約束
);
總結:需要給多個欄位聯合起來表示某一個約束的時候,採用表級約束,not null只有列級約束
6.4 not null unique約束
create table t_vip(
id int,
name varchar(32) not null unique
);
如果一個欄位同時被not null和unique約束式,該欄位自動變成主鍵欄位,(oracle不是這樣)
6.5 primary key主鍵約束
被加了主鍵約束的欄位被稱為主鍵欄位,主鍵欄位上的每一個值都稱為主鍵值
主鍵的作用:主鍵是每一行記錄的標識,相當於每一條資料的身份證號,沒有主鍵,表無效
主鍵的特徵:not null + unique
create table t_vip(
id int primary key,//單一主鍵,列級約束
name varchar(32)
);
或者
create table t_vip(
id int,
name varchar(32),
primary key(id,name)//複合主鍵,兩個欄位聯合起來不重複即可,在實際中不建議使用複合主鍵,表級約束
);
注意:一張表中只能有一個主鍵,單一主鍵、複合主鍵算一個主鍵,主鍵值建議定長型別的數,不建議varchar
主鍵分類:自然主鍵和業務主鍵,儘量使用沒有意義的自然主鍵
create table t_vip(
id int primary key auto_increment,//自動生成從1開始遞增的自然數
name varchar(32)
);
6.6foreign key外來鍵約束
被加了外來鍵約束的欄位被稱為外來鍵欄位,外來鍵欄位上的每一個值都稱為外來鍵值
多個重複資料冗餘,將一張表拆分成兩個表
t_class
classno (pk) classname
100 北京市第一中學高一1班
101 北京市第一中學高一2班
t_student
no(pk) name cno
1 jack 100
2 lucky 101
3 lily 100
4 alice 100
5 bob 101
當cno中的欄位沒有約束時,可能會導致資料無效,為了保證cno欄位中的值有效,需要給cno欄位加上外來鍵約束
t_class是父表,t_student是子表
建立時:先建立父,再建立子
刪除時:先刪除子,再刪除父
create table t_class(
classno int primary key,
classname varchar(200)
);
create table t_student(
no int primary key auto_increment,
name varchar(255),
cno int,
foreign key(cno) reference t_class(classno)//被引用的classno欄位需要具有唯一性,con需要為null或classno中的值
);
6.7儲存引擎
儲存引擎是一個表儲存/組織資料的方式,是mysql中特有的術語
在建立表時,可以在‘)’後面加上engine關鍵字制定儲存引擎
create table t_class(
classno int primary key,
classname varchar(200)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
show create table t_class;//可以檢視當前表格使用哪個儲存引擎
show engines \G;//可以檢視當前支援什麼儲存引擎
mysql支援9個,版本不同支援引擎不同
常見儲存引擎:
- MyISM:使用三個檔案表示資料,格式檔案、資料檔案、索引檔案(表的目錄,可以縮小檢索範圍,提高搜尋效率,可被壓縮,可以設定成只讀表來節省空間),對於一張表上加有unique約束的欄位,會自動生成索引。安全性低,不支援事務。
- InnoDB:重量級儲存引擎,預設儲存引擎,特點是非常安全,崩潰後可以自動恢復資料,但是效率不高。在資料庫目錄中以.frm格式檔案表示。
- MEMORY:資料儲存在記憶體當中,且行的長度確定,因此它的執行速度很快。缺點是不安全,關機之後資料消失。不包含TEXT或BLOB欄位,在資料庫目錄中以.frm格式檔案表示。記憶體直接取資料,因此查詢速度極快