資料庫入門3
儲存引擎
概念
MySQL內部針對資料的儲存有很多不同的方式,我們可以簡單地把這些儲存方式理解為儲存引擎。
檢視方法
輸入:show engines;
主要的儲存引擎
InnoDB
MySQL5.5之後的版本預設的儲存引擎。
支援事務、行鎖、外來鍵,這樣會讓資料更安全。
事務:保證多個數據的操作要麼全部完成要麼全部失敗
行鎖:多一行行資料加鎖 同一時間只能有一個人操作
外來鍵:建立表關係(後面詳細的講)
MyISAM
MySQL5.5之前的版本預設的儲存引擎
由於不支援事務、外來鍵等功能,所以安全性和InnoDB相比較低,但是存取資料的速度比InnoDB更快。
memory
資料直接存在記憶體,速度快但是斷電立刻丟失。
blackhole
寫入其中的資料都會丟失。
儲存引擎表文件
create table t1(id int)engine=InnoDB; create table t2(id int)engine=MyISAM; create table t3(id int)engine=memory; create table t4(id int)engine=blackhole;
不同的儲存引擎生成的檔案數量不同
InnoDB有兩個檔案
.frm 表結構
.ibd 表資料、索引(相當於書的目錄)
MyISAM有三個檔案
.frm 表結構
.MYD 表資料
.MYI 表索引
memory有一個檔案
.frm 表結構
blackhole有一個檔案
.frm 表結構
儲存資料特性
insert into t1 values(1); insert into t2 values(1); insert into t3 values(1); insert into t4 values(1);
建立表的完整語法
create table 表名( 欄位名 欄位型別(寬度) 約束條件, 欄位名 欄位型別(寬度) 約束條件, 欄位名 欄位型別(寬度) 約束條件 );
注意:
1.欄位名和欄位型別是必須的,寬度和約束條件是可選的。
2.約束條件可選,並且一個欄位可支援多個約束條件。
3.最後結尾的欄位語句不能有逗號。
欄位型別
整型
整型的分類有:tinyint,smallint,int,bigint,不同的整型型別能儲存的數字範圍是不同的。
預設的整型都是帶正負號的。
消除符號的方法--unsigned
create table t7(id tinyint unsigned); # unsigned約束條件 無符號 insert into t7 values(-129),(256); # 0 255
浮點型
浮點型的分類有:float,double,decimal,不同的浮點型儲存小數的範圍和精度不一樣。
float(255,30) # 總共255位小數位佔30位 double(255,30) # 總共255位小數位佔30位 decimal(65,30) # 總共65位小數位佔30位 create table t8(id float(255,30)); create table t9(id double(255,30)); create table t10(id decimal(65,30)); insert into t8 values(1.111111111111111111111111111111); insert into t9 values(1.111111111111111111111111111111); insert into t10 values(1.111111111111111111111111111111); # 精確度:float < double < decimal
精確度問題在很多場景下都會發生 有時候我們會採取不同的型別來儲存,比如手機號全部是數字儲存的時候應該使用整型 但是有時候我們使用字元型別。
字元型別
字元型別分為:char和varchar,這兩個資料型別在儲存資料上有本質的區別
char(4)
最多可以儲存4個字元,超過了報錯,沒有超過也按照四個字元儲存,預設空格填充。
varchar(4)
最多可以儲存4個字元,超過了報錯,沒有超過則按照實際有幾個字元存幾個。
create table t11(id int,name char(4)); create table t12(id int,name varchar(4)); insert into t11 values(1,'jason'); insert into t12 values(1,'jason');
5.6版本超出了範圍沒有報錯是因為我們沒有開啟嚴格模式(5.7及之後版本預設都有)
char_length() 統計資料長度
預設情況下MySQL會自動填充儲存並在查詢的時候自動去除填充的空格
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
嚴格模式
檢視嚴格模式
show variables like '%mode%';
修改嚴格模式
set global sql_mode = 'strict_trans_tables';
最後需要退出客戶端重新進入
時間型別
date 年月日 time 時分秒 Datetime 年月日時分秒 Year 年 create table student( id int, name char(16), born_year year, birth date, study_time time, reg_time datetime );
時間資料很多時候都是自動獲取,這裡僅僅是演示一下
insert into student values(1,'jason','2022','2022-05-09','11:11:00','2022-11-11 11:11:11');
列舉與集合型別
enum:多選一
set:多選多,包含多選一
列舉型別
create table t13(
id int,
name varchar(16),
gender enum('male','female','others')
);
'''插入資料的時候只能夠插入提前規定好的'''
insert into t13 values(1,'jason','男'); # 報錯
insert into t13 values(2,'tony','male');
集合型別
create table t14( id int, name char(16), hobby set('basketball','football','doublecolorball') ); '''插入資料的時候只能夠插入提前規定好的''' insert into t14 values(1,'jason','read'); # 報錯 insert into t14 values(2,'kevin','basketball'); # 可選一 insert into t14 values(3,'tony','basketball,football'); # 可選多
寬度說明
針對數字型別,寬度並不是用來限制儲存長度而是用來表示展示長度。
但是對數字無效,所以在定義數字的時候不需要手動新增寬度。
約束條件
插入資料的方式
方式1:insert into t1 values()
這個方式是按照欄位順序依次傳入的,一個都不能少。
方式2:insert into t1(id,name) values()
這個方式是按照指定的欄位傳入,可以少。
unsigned # 無符號 zerofill # 0填充 # unique 唯一 '''單列唯一''' create table t20( id int, name varchar(16) unique ); '''多列唯一''' create table t21( id int, host int, port int, unique(host,port) );
not null 不能為空 使用頻率很高
create table t18(
id int,
name varchar(16) not null
);
default 預設值
create table t19(
id int,
name varchar(16) default '匿名使用者'
);
unique 唯一
單列唯一
create table t20(
id int,
name varchar(16) unique
);
多列唯一
create table t21(
id int,
host int,
port int,
unique(host,port)
);