1. 程式人生 > 其它 >資料庫入門3

資料庫入門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)

);