1. 程式人生 > 其它 >MySQL基本資料型別及約束條件

MySQL基本資料型別及約束條件

內容概要

  • 儲存引擎

  • MySQL基本資料型別

    整型
    浮點型
    字元型別
    日期型別
    列舉與集合型別
    
  • 約束條件

    unsigned
    zerofill
    not null
    default
    unique
    primary key
    

內容詳細

儲存引擎

# 儲存引擎可以看成是處理資料的不同方式

# 檢視儲存引擎的方式
	show engines;
    
# 需要掌握的四個儲存引擎
	myISAM
    	MySQL5.5之前預設的儲存引擎
        	支援事務、行級鎖和外來鍵 針對資料的操作較於InnoDB不夠安全
	InnoDB
    	MySQL5.5之後預設的儲存引擎
        	支援事務、行級鎖和外來鍵 針對資料的操作更加的安全
	memory
    	基於記憶體儲存資料
        	速度最快但是斷電立刻丟失
	blackhole
    	寫入其中的資料都會立刻消失 類似於垃圾處理站
	
# 儲存引擎建立表的不同點
	creatr table t1(id int) engine=myisam;
    creatr table t2(id int) engine=innodb;
    creatr table t3(id int) engine=memory;
    creatr table t4(id int) engine=blackhole;
    
"""
MyISAM會建立三個檔案
	.frm	表結構檔案
	.MYD	表資料檔案
	.MYI	表索引檔案(索引是由來加快資料查詢的)
InnoDB會建立兩個檔案
	.frm	表結構檔案
	.ibd	表資料和表索引檔案
memory
	.frm	表結構檔案
blcakhole
	.frm	表結構檔案
"""

MySQL基本資料型別

# 1.整形
	tinyint	smallint	int	bigint
    不同的int型別能夠儲存的數字範圍是不一樣的
    	1.要注意是否存負號(正負號需要佔一個位元位)
        2.針對手機號碼只能用bigint
	"""研究預設是否需要正負號"""
        create table t5(id tinyint);
        insert into t5 values(-999),(999);
	# 結論:所有的int型別預設都需要正負號
    	create table t6(id tinyint unsigned);	# 移除正負號
        insert into t6 values(-999),(999);
        
# 2.浮點型
	float		double		decimal
    float(255,30)	# 總共255位 小數位佔30位
    double(255,30)	# 總共255位 小數位佔30位
    decimal(65,30)	# 總共65位 小數位佔30位
    """研究三者的不同"""
    create table t7(id float(255,30));
    create table t8(id float(255,30));
    create table t9(id float(65,30));
        insert into t7 values(1.11111111111111111111111);
    insert into t8 values(1.11111111111111111111111);
    insert into t9 values(1.11111111111111111111111);
    # 結論:三者的精確度不一樣
    	float < double < decimal
        
    """
    到底使用哪個?
    	一般情況下小數點後面只保留兩位 所以float足矣
    	如果是從事高精密業務 則需要考慮更高的精確度
    ps:有時候很多看似需要用數字儲存的資料 可能都是存的字串
    課外擴充套件:python本身對數字的精確度很低 之所以能夠從事人工智慧和資料分析完全得益於功能強大的模組
    """
    
# 3.字元型別
	char(4)
    	定長型別 最多隻能存四個字元 多了報錯少了自動空格填充至四個
	carchar(4)
    	變長型別 做多隻能存四個字元 多了報錯少了有幾個則存幾個
	"""研究上述特徵"""
    create table t10(id int,name char(4));
    create table t11(id int,name varchar(4));
    insert into t10 values(1,'jason');
    insert into t11 values(1,'jason');
    # 針對5.6版本超出班委不會報錯 而是自動幫你擷取並儲存(此行為不合理)
    方式1:修改配置檔案(永久)
	方式2:命令修改(暫時)
        show variables like '%mode%'
        set session	# 當前視窗有效
        set global	# 當前服務端有效
        	set gloabl sql_mode = 'strict_trans_tables'
		修改完畢後退客戶端重進進入即可 再次執行上述插入命令 會直接報錯
	# 研究定長與邊長特性
    	insert into t1o values(2;'j');
        insert into t11 values(2;'j');
        # 統計某個欄位資料的長度 char_length()
        例:select char_length(name) from t10 where id=1;
	'''底層確實會填充 但是取出來的時候又會自動去除'''
    set global sql_mode = 'strict_trans_tables,pad_char_to_full_length'

char與varchar的對比

char;
	優勢:整取整存 速度快
	劣勢:浪費儲存空間
varchar;
	優勢:節省空間
	劣勢:存取優勢的速度較char慢
"""
char(5)
	jasontony kevintom oscartank sean jerry
varchar(5)
	1bytes+jason1bytes+tony1bytes+kevin1bytes+tom1bytes
	存:先計算資料的長度
	取:先獲取報頭的資料
"""
# 以前幾乎用的是char 現在很多情況下使用varchar
	進了公司之後 會通過郵件告訴你每個欄位的英文名和中文名及型別等專案的諸多資訊
    
補充:在建立欄位的時候可以加上相應的註釋
    關鍵字comment
    create table t12(
        id int comment '序號',
        name char(4) comment '姓名'
    );

整型中括號內數字的作用

create table t13(id int(3));
insert into t13 values(8888888);
"""
在整型中括號內的數字並不是用來限制儲存的長度 而是用來控制展示的長度
我們以後在定義整型欄位的時候 不需要自己新增數字 使用預設的就可以
"""
create table t14(id int(3) zerofill);
insert into t14 values(4);
# 結論:整型比較特殊 是唯一一個不是用來限制儲存長度的型別

列舉與集合型別

列舉
	多選一
enum()
	create table user(
    	id int,
        name varchar(32),
        gender enum('male','female','others')
    )
        insert into user values(1,'jason','男');  # 報錯
    insert into user values(1,'jason','male');  # 正常
    
集合
	多選多(包含了多選一)
set()
	create table userinfo(
    	id int,
        name char(16),
        hobby
set('baskerball','football','volleyball'
    )
    );

日期型別

date			年月日
datetime		年月日時分秒
time			時分秒
year			年份

create table client(
	id int,
    name varchar(32),
    reg_time date,
    birth datetime,
    study_time time,
    join_time year
);
insert into client values(1,'jason','2000-11-11','2000-1-21 11:11:11','11:11:11',1995);

建立表的完整語法

create table 表名(
	欄位名1 欄位型別(數字) 約束條件,
    欄位名2 欄位型別(數字) 約束條件,
    欄位名3 欄位型別(數字) 約束條件
)
"""
1.欄位名和欄位型別是必須的
2.數字和約束條件是可選的 並且 約束條件可以有多個 空格隔開即可
3.最後一個語句的結尾不要加逗號
"""

約束條件

"""
約束條件相當於是在欄位型別的基礎之上新增的額外約束
	eg:id int unsigned
"""
unsigned		讓數字沒有正負號
zerofill		多餘的使用數字0填充
not null		非空
	"""
	新增表資料的方式
		方式1:按照欄位順序一一傳值
			insert into t1 values(1,'jason');
		方式2:自定義傳值順序 甚至不傳值
			insert into t1(name,id) 		values('jason',1);
			insert into t1(id) values(1);
	在MySQL中不傳資料 會使用關鍵字NULL填充意思就是空 類似於python中的None
	"""
    
    creatr table t2(
    	id int,
        name varchar not null
    );
default		預設值
	"""
	所有的欄位都可以設定預設值
		使用者不給該欄位傳值則使用預設的 否則使用傳的
	create table t3(
		id int default 911,
		name varchar(16) default 'jason'
	);
	"""
    
unique			唯一值
	"""
	單列唯一
		create table t4(
			id int ,
			name varchar(32) unique
		);
	"""
    聯合唯一
    	create table t5(
        	id int,
            host varchar(32),
            port int,
            unique(host,port)
        );

promary key		主鍵
	"""
	但從約束層面上來說 相當於是 not null +unique(非空且唯一)
	在此基礎之上 還可以加快資料的查詢
	
	InnoDB儲存引擎規定了一張表必須有且只有一個主鍵
		因為InnoDB是通過主鍵的方式來構造表的
		如果沒有設定主鍵
			情況1:沒有主鍵和其他約束條件
				InnoDB會採用隱藏的欄位作為主鍵 不能加快資料的查詢
			情況2:沒有主鍵但是有非空且唯一的欄位
				自動將該欄位升級位主鍵
				create table t6(
					id int,
					age int not null unique,
					pwd int not null unique
				);
	結論:
		以後我們在建立表的時候一定要設定主鍵
		並且主鍵欄位一般都是表的id欄位(uid sid pid cid)
		create table user1(
			id int primary key,
			name varchar(32)
		);
	"""
auto_increment		自增
	"""
	由於主鍵類似於資料的唯一標識 並且主鍵一般都是數字型別
	我們在新增資料的時候不可能記住接下來的序號是多少 太麻煩
	create table user1(
			id int primary key auto_increment,
			name varchar(32)
		);
	"""

自增的特性

自增不會因為刪除操作而後退
	delete from無法影響自增
如果想要充值需需要使用truncate關鍵字
	truncate 表明	# 清空表資料並且重置主鍵值