一.存儲引擎
引擎 指的是一個系統的核心部分
引擎有不同分類是為了適應不同的使用場景
查看mysql支持所有引擎
show engines;
MRG_MYISAM 是一堆MYISAM表的集合
用於做水平分表,如果一個表中數據量太大 將導致效率降低
水平分表就是把整個大表拆成不同的小表,每一次查詢 會判斷數據在哪一個表中 然后對應去查找 以此來提高效率
name age sex
jerry 40 woman
name age sex
bgon 30 man
垂直分表
name age sex phone addr gf bf idcard number
jerry 40 woman 110 上海 xx xx 身份證 學號
當一個表中 字段太多 然而常用的信息就那么一兩個 那就可以把不常用字段 切到另一個表中 然后建立關聯關系
innodb 是最最常用的引擎 因為支持 事務 行鎖 外鍵一系列功能....
MyISAM 沒有上述一堆功能 但是 存儲效率比innodb要高 並且支持分表
MEMORY 速度快 不能永久存儲 沒有特別的功能
二.詳細建表語句
[]表示可選
create table 名稱(字段 類型[(寬度) 約束條件],字段 類型,......)
三.mysql數據類型
為什么要給數據分類?
1.不同的數據類型 描述信息可以更加方便准確
2.在計算機中對數據分類可以減少內存開銷
1.數字
整型 默認都是有符號的
tinyint 1個字節 8個二進制 0-255 -128 - 127
smallint 2個字
mediumint 3個字節
int 4個字節
bigint 8個字節
設置為無符號 需要在類型后添加unsigned
create table t8(a tinyint unsigned);
寬度在整型數據中 不是用來設置可存儲的數據范圍的
用於控制最先小顯示長度(字符數) 如果長度不足 就幫你補0 但是需要指定zerofill
create table t12(a tinyint(5) zerofill);
結論是: 使用整型數據 寬度這個屬性一般不用管它
浮點
float 4個字節
float(a,b)
double 8個字節
double(a,b)
decimal 不固定
decimal(a,b)
a代表總位數 b表示小數位數
5,3 最大值99.999
共同點: 小數位最大為30
float與double總長最大為255
都是不精確的 double比float精確點
不同點:
decimal總長最大為65 並且是精確的
2.字符串
char固定長度 和 varchar 可變長度
char(L) varchar(L)
L 都是表示最大可存儲的長度 不是字節
a char(4) b varchar(4)
a:S 最終還是占4個字符長度
b:S 最終占1個字符長度 + 標識信息的長度(1-2字節)
S S S
如果有三個數據要存 每個數據都是一個s字符 最終3 * 4 12個字符長度
占用空間較多 存取速度較快
1S1S1S varchar 存儲時必須保存一個長度標識信息 所以所占空間為實際內容長度+標識信息長度
相比較char 空間節省了 但是效率降低了
char采取的空間換時間 提高效率
字符串類型的BUG 由於char類型是定長 mysql會在末尾填充空格來達到定長的效果
所以char類型 不能存儲末尾帶有空格的數據 會直接把空格給去了
固定長度的字符串類型 不常用
tinytext 1字符
text 2字符
mediumtext 3字符
longtext 4字符
3.二進制數據類型 單位都是字節
binary varbinary
binary是固定長度的二進制
varbinary 可變長度的二進制
長度固定無法修改的二進制
tinyblob
blob
mediumblob
longblob
強調:
二進制數據類型 一般不用 如果要存儲多媒體 如 音頻 視頻
需要將其放到FTP文件服務器上 然后數據庫中只存儲連接即可
4.時間類型
year 4為年份
date 日期 yyyy-MM-DD
time 時間 HH:mm:SS
datetime yyyy-MM-DD HH:mm:SS
timestamp 時間戳 一個浮點類型 從unix元年到現在的秒數
year 可以是數字 也可以是字符串
可以用四位字符串 也可以2位字符 或數字
00-69 == 2001-2069
70-99 == 1970 - 1999
甭管什么時間類型 照着標准格式字符串寫 就行
timestamp 會自動更新時間 當你插入時 或修改時
current_time 和 now() 所有的時間 日期類型 都可以使用這兩個方法來輸入當前時間
所有的日期時間 數據庫返回的都是字符串類型
嚴格模式
5.7以下的版本 默認是非嚴格模式的 例如你的類型為tinyint 存儲的是128 最終存儲的是127
set global sql_mode = "strict_trans_tables" 可以將其設置為嚴格模式
最好寫到配置文件中 永久有效
enum 提前規定該字段能選的值的范圍 多選1
set 提前規定該字段能選的值的范圍 區別是 set字段 可以有多個值 用逗號隔開 多選多
數據庫范式
就是指導你該如何設計數據庫
數據類型 整型 int 浮點 float-double decimal 字符串 char varchar 時間-日期 枚舉-集合 二進制
在保證數據足夠保存情況下 選用占用空間最小的類型
四.約束
完整的建表語句
create table 名稱(字段 類型[(寬度) 約束條件],字段 類型,......)
約束 是指 給數據的值加上一些限制
類型就是一種限制 寬度對於整型數據 沒有存儲限制 其他類型的寬度是有限制作用的
約束就是除了 數據類型以及寬度之外的其他限制
unsigned就是約束中第一種 表示你的整數 不能包含符號 僅針對數字類型
約束 是為了保證數據的完整性
完整性約束
not null 非空
限制該字段 必須有值
例如賬號密碼
default 默認值
例如 多數用戶都是男的 游戲賬號的金幣可以默認
1.建表直接指定
create table t(name char(10) not null default 默認值);
2.后期增加約束
alter table t modify name char(10) not null default 已有的字段
alter table t add sex char(10) not null default 新增字段
unique 唯一性約束 並且是一個索引
要求該字段的值 不能重復
單字段:
create table olbPerson(name char(20) unique,school char(10));
多字段聯合唯一約束
create table olbPerson(name char(20),school char(10), unique(name,school));
例如:姓名和校區兩個字段 如果兩個校區有相同的姓名 這時候就可以把這兩個字段作為聯合唯一索引
這些字段都相同才算是重復
primary key 主鍵約束
從約束角度來看 和 非空 + 唯一 是相同的效果
不能為空且不能重復
需要強調的是:
主鍵除了有約束的效果 還是一個索引 並且是非常重要的索引
在該innodb 主鍵是必不可少的
innodb 組織數據結構是按照樹形結構來組織的,該結構中 必須有一個數據 不能為空且唯一的
如果沒有這樣的數據 樹形結構也就不存在.
mysql在創建表的時候 會檢測 是否存在主鍵
如果沒有 它就找一個具有非空且唯一約束的字段提升為主鍵
如果也沒有這樣的字段 mysql就創建一個隱藏字段作為主鍵
索引 可以提高查詢速度
結論是: 只要你是用innodb引擎 你就應該建表時設置一個主鍵 通常主鍵字段叫做id
id 有唯一標識的意思
索引 就像是 字典里目錄 用於快速定位數據所在位置
自動增長
主鍵在使用中 需要我們自己來維護 其正確性 你需要知道上一次寫的是什么 然后找一個之前沒用過的主鍵
mysql 提高了自動增長約束 可以幫你自動管理主鍵的值
要求必須是整型,每次插入數據都會自動+1 程序中就不要再自己管理主鍵了
語法:
create table table_name(id int primary key auto_increment,name char(10));
# 插入帶有自動增長的字段時 可以直接忽略該字段 也可以插入一個null
insert into table_name values(null,"jack");
insert into table_name(name) values("jack");
只要你創建一個表 就應該有主鍵 並且自動增長.
foreign key 外鍵約束