您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何學(xué)習(xí)MySQL約束及存儲(chǔ)引擎,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
# ### char varchar (補(bǔ)充) char 字符長(zhǎng)度 255個(gè) varchar 字符長(zhǎng)度 21845個(gè) # ### part1 時(shí)間類型 date YYYY-MM-DD 年月日 (節(jié)假日,紀(jì)念日) time HH:MM:SS 時(shí)分秒 (體育競(jìng)賽,記錄時(shí)間) year YYYY 年份 (歷史,酒的年份) datetime YYYY-MM-DD HH:MM:SS 年月日 時(shí)分秒 (上線時(shí)間,下單時(shí)間) create table t1(d date, t time , y year , dt datetime); insert into t1 values("2020-11-3","9:19:30","2020","2020-11-3 9:19:30"); insert into t1 values(now(),now(),now(),now()); timestamp YYYYMMDDHHMMSS(時(shí)間戳) 自動(dòng)更新時(shí)間 (不需要手動(dòng)寫入,自動(dòng)實(shí)現(xiàn)更新記錄,[用作記錄修改的時(shí)間]) create table t2(dt datetime , ts timestamp); insert into t2 values(20201103092530 , 20201103092530); insert into t2 values(null,null); # 區(qū)別 timestamp 自動(dòng)更新時(shí)間(以當(dāng)前時(shí)間戳) datetime沒有 insert into t2 values(20390102101010 , 20390102101010); error # 超越2038 # ### part2 約束 : 對(duì)編輯的數(shù)據(jù)進(jìn)行類型的限制,不滿足約束條件的報(bào)錯(cuò) unsigned : 無(wú)符號(hào) not null : 不為空 default : 默認(rèn)值 unique : 唯一值,加入唯一索引 (索引相當(dāng)于字典目錄,索引的提出是為了加快速度,一味地亂加索引不會(huì)提高查詢效率) primary key: 主鍵 auto_increment: 自增加一 zerofill : 零填充 foreign key: 外鍵 # unsigned 無(wú)符號(hào) create table t3(id int unsigned); insert into t3 values(-1); error insert into t3 values(4000000000); success # not null : 不為空 create table t4(id int not null , name varchar(11)); insert into t4 values(1,"張宇"); insert into t4 values(null,"張宇"); error insert into t4(name) values("李四"); error # default : 默認(rèn)值 create table t5(id int not null , name varchar(11) default "沈思雨" ); insert into t5 values(1,null); insert into t5(id) values(2); create table t5_2(id int not null default "1111" , name varchar(11) default "沈思雨" ); insert into t5_2 values(); # 在values里面不寫值,默認(rèn)使用默認(rèn)值; # unique : 唯一值,加入唯一索引(索引的提出是為了加快速度,一味地亂加索引不會(huì)提高查詢效率) # 唯一 可為null 標(biāo)記成: UNI create table t6(id int unique , name char(10) default "趙萬(wàn)里" ); insert into t6(id) values(1); insert into t6(id) values(1); error insert into t6(id) values(null); insert into t6(id) values(null); # id變成了多個(gè)null # primary key: 主鍵 [ 唯一 + 不為null ] PRI 標(biāo)記數(shù)據(jù)的唯一特征 """一個(gè)表中,只能設(shè)置一個(gè)字段為一個(gè)主鍵,unique唯一約束可以設(shè)置多個(gè)""" # 創(chuàng)建主鍵 create table t7(id int primary key , name varchar(10) default "趙沈陽(yáng)"); insert into t7(id) values(1); insert into t7(id) values(1); error insert into t7(id) values(null); error # unique + not null => PRI create table t8(id int unique not null , name varchar(10) default "趙沈陽(yáng)" ); # primary key / unique + not null => 優(yōu)先把primary key 作為主鍵; create table t9(id1 int unique not null , id2 int primary key ); # 一個(gè)表只能設(shè)置單個(gè)字段為一個(gè)主鍵; create table t10(id1 int primary key , id2 int primary key ); error # auto_increment: 自增加一 (一般配合 主鍵或者unique 使用) create table t11(id int primary key auto_increment , name varchar(255) default "敬文棟"); insert into t11 values(1,"張三"); insert into t11 values(null,"李四"); insert into t11(id) values(null); # 使用默認(rèn)值或者自增插入數(shù)據(jù) insert into t11 values(); # 刪除數(shù)據(jù) delete from t11; # 刪除數(shù)據(jù) + 重置id truncate table t11; # zerofill : 零填充 (配合int使用,不夠5位拿0來(lái)填充) create table t12(id int(5) zerofill); insert into t12 values(1234567); insert into t12 values(12);
# ### part3"""主鍵索引 : PRI [primary key]唯一索引 : UNI [unique]普通索引 : MUL [index]"""# 1.聯(lián)合唯一索引"""unique(字段1,字段2,字段3 ..... ) 合在一起,該數(shù)據(jù)不能重復(fù)"""# unique + not nullcreate table t1_server(id int , server_name varchar(10) not null , ip varchar(15) not null , port int not null , unique(ip,port) );insert into t1_server values(1,"阿里","192.168.11.251",3306);insert into t1_server values(1,"阿里","192.168.11.251",80);insert into t1_server values(1,"阿里","192.168.11.252",80);insert into t1_server values(1,"阿里","192.168.11.252",80); error# unique : 有可能出現(xiàn)多個(gè)空值的情況要注意;create table t2_server(id int , server_name varchar(10) not null , ip varchar(15) , port int , unique(ip,port) );insert into t2_server values(1,"騰訊","192.168.11.251",3306);insert into t2_server values(1,"騰訊","192.168.11.251",3306); errorinsert into t2_server values(1,"騰訊",null,null); # 注意點(diǎn): 允許插入多個(gè)空值;+------+-------------+----------------+------+| id | server_name | ip | port |+------+-------------+----------------+------+| 1 | 騰訊 | 192.168.11.251 | 3306 || 1 | 騰訊 | NULL | NULL || 1 | 騰訊 | NULL | NULL || 1 | 騰訊 | NULL | NULL || 1 | 騰訊 | NULL | NULL |+------+-------------+----------------+------+# 2.聯(lián)合唯一主鍵create table t3_server(id int ,server_name varchar(10) not null , ip varchar(15) , port int , primary key(ip,port) );insert into t3_server values(1,"華為","192.168.11.251",3306);insert into t3_server values(1,"華為","192.168.11.251",3307);"""總結(jié):primary key(字段1,字段2 ... ) 聯(lián)合唯一主鍵 , 單個(gè)字段情況,可以設(shè)置一個(gè)主鍵,如果是多個(gè)字段只能設(shè)置成聯(lián)合主鍵,合在一起表達(dá)一個(gè)主鍵概念;unique(字段1,字段2 ... ) 聯(lián)合唯一索引index(字段1,字段2 ... ) 聯(lián)合普通索引"""# 3.foreign key: 外鍵,把多張表通過(guò)一個(gè)關(guān)聯(lián)字段聯(lián)合在一起 (該字段可以設(shè)置成外鍵,作用是可以聯(lián)級(jí)更新或者聯(lián)級(jí)刪除)""" 語(yǔ)法:foreign key(classid) references class1(id) 條件:被關(guān)聯(lián)的字段,必須具備唯一屬性;"""student1:id name age classid 1 wangtongpei 58 12 liuyifeng 85 13 wangwen 18 2class1:id classname 1 python322 python33# 創(chuàng)建class1create table class1(id int , classname varchar(255));# 添加唯一索引alter table class1 add unique(id);# 刪除索引create table class222(id int unique, classname varchar(255));alter table class1 drop index id;# 創(chuàng)建student1create table student1(id int primary key auto_increment,name varchar(255),age int,classid int,foreign key(classid) references class1(id));# 添加數(shù)據(jù)insert into class1 values(1,"python32");insert into class1 values(2,"python33");insert into class1 values(3,"python34");insert into student1 values(null,"wangtongpei",58,1);insert into student1 values(null,"liuyifeng",85,1);insert into student1 values(null,"wangwen",18,2);# 沒有關(guān)聯(lián)的數(shù)據(jù)可以直接刪除delete from class1 where id = 1;# 有關(guān)聯(lián)的數(shù)據(jù)不能直接刪除,要先把關(guān)聯(lián)的數(shù)據(jù)刪掉之后再刪除delete from student1 where id = 3;delete from class1 where id = 2;# 聯(lián)級(jí)更新 , 聯(lián)級(jí)刪除 ( 謹(jǐn)慎使用 )"""聯(lián)級(jí)刪除 on delete cascade聯(lián)級(jí)更新 on update cascade"""# 創(chuàng)建class2create table class2(id int primary key auto_increment, classname varchar(255));# 創(chuàng)建student2create table student2(id int primary key auto_increment,name varchar(255),age int,classid int,foreign key(classid) references class2(id) on delete cascade on update cascade #區(qū)別);# 添加數(shù)據(jù)insert into class2 values(1,"python32");insert into class2 values(2,"python33");insert into class2 values(3,"python34");insert into student2 values(null,"wangtongpei",58,1);insert into student2 values(null,"liuyifeng",85,1);insert into student2 values(null,"wangwen",18,2);# 聯(lián)級(jí)刪除 (把所有關(guān)聯(lián)數(shù)據(jù)全部刪除,謹(jǐn)慎;)delete from class2 where id = 1;# 聯(lián)級(jí)更新 (把所有關(guān)聯(lián)數(shù)據(jù)全部更新,謹(jǐn)慎;)update class2 set id = 100 where classname="python33# ### part3 """ 主鍵索引 : PRI [primary key] 唯一索引 : UNI [unique] 普通索引 : MUL [index] """ # 1.聯(lián)合唯一索引 """unique(字段1,字段2,字段3 ..... ) 合在一起,該數(shù)據(jù)不能重復(fù)""" # unique + not null create table t1_server(id int , server_name varchar(10) not null , ip varchar(15) not null , port int not null , unique(ip,port) ); insert into t1_server values(1,"阿里","192.168.11.251",3306); insert into t1_server values(1,"阿里","192.168.11.251",80); insert into t1_server values(1,"阿里","192.168.11.252",80); insert into t1_server values(1,"阿里","192.168.11.252",80); error # unique : 有可能出現(xiàn)多個(gè)空值的情況要注意; create table t2_server(id int , server_name varchar(10) not null , ip varchar(15) , port int , unique(ip,port) ); insert into t2_server values(1,"騰訊","192.168.11.251",3306); insert into t2_server values(1,"騰訊","192.168.11.251",3306); error insert into t2_server values(1,"騰訊",null,null); # 注意點(diǎn): 允許插入多個(gè)空值; +------+-------------+----------------+------+ | id | server_name | ip | port | +------+-------------+----------------+------+ | 1 | 騰訊 | 192.168.11.251 | 3306 | | 1 | 騰訊 | NULL | NULL | | 1 | 騰訊 | NULL | NULL | | 1 | 騰訊 | NULL | NULL | | 1 | 騰訊 | NULL | NULL | +------+-------------+----------------+------+ # 2.聯(lián)合唯一主鍵 create table t3_server(id int ,server_name varchar(10) not null , ip varchar(15) , port int , primary key(ip,port) ); insert into t3_server values(1,"華為","192.168.11.251",3306); insert into t3_server values(1,"華為","192.168.11.251",3307); """ 總結(jié): primary key(字段1,字段2 ... ) 聯(lián)合唯一主鍵 , 單個(gè)字段情況,可以設(shè)置一個(gè)主鍵,如果是多個(gè)字段只能設(shè)置成聯(lián)合主鍵,合在一起表達(dá)一個(gè)主鍵概念; unique(字段1,字段2 ... ) 聯(lián)合唯一索引 index(字段1,字段2 ... ) 聯(lián)合普通索引 """ # 3.foreign key: 外鍵,把多張表通過(guò)一個(gè)關(guān)聯(lián)字段聯(lián)合在一起 (該字段可以設(shè)置成外鍵,作用是可以聯(lián)級(jí)更新或者聯(lián)級(jí)刪除) """ 語(yǔ)法: foreign key(classid) references class1(id) 條件: 被關(guān)聯(lián)的字段,必須具備唯一屬性; """ student1: id name age classid 1 wangtongpei 58 1 2 liuyifeng 85 1 3 wangwen 18 2 class1: id classname 1 python32 2 python33 # 創(chuàng)建class1 create table class1(id int , classname varchar(255)); # 添加唯一索引 alter table class1 add unique(id); # 刪除索引 create table class222(id int unique, classname varchar(255)); alter table class1 drop index id; # 創(chuàng)建student1 create table student1( id int primary key auto_increment, name varchar(255), age int, classid int, foreign key(classid) references class1(id) ); # 添加數(shù)據(jù) insert into class1 values(1,"python32"); insert into class1 values(2,"python33"); insert into class1 values(3,"python34"); insert into student1 values(null,"wangtongpei",58,1); insert into student1 values(null,"liuyifeng",85,1); insert into student1 values(null,"wangwen",18,2); # 沒有關(guān)聯(lián)的數(shù)據(jù)可以直接刪除 delete from class1 where id = 1; # 有關(guān)聯(lián)的數(shù)據(jù)不能直接刪除,要先把關(guān)聯(lián)的數(shù)據(jù)刪掉之后再刪除 delete from student1 where id = 3; delete from class1 where id = 2; # 聯(lián)級(jí)更新 , 聯(lián)級(jí)刪除 ( 謹(jǐn)慎使用 ) """ 聯(lián)級(jí)刪除 on delete cascade 聯(lián)級(jí)更新 on update cascade """ # 創(chuàng)建class2 create table class2(id int primary key auto_increment, classname varchar(255)); # 創(chuàng)建student2 create table student2( id int primary key auto_increment, name varchar(255), age int, classid int, foreign key(classid) references class2(id) on delete cascade on update cascade #區(qū)別 ); # 添加數(shù)據(jù) insert into class2 values(1,"python32"); insert into class2 values(2,"python33"); insert into class2 values(3,"python34"); insert into student2 values(null,"wangtongpei",58,1); insert into student2 values(null,"liuyifeng",85,1); insert into student2 values(null,"wangwen",18,2); # 聯(lián)級(jí)刪除 (把所有關(guān)聯(lián)數(shù)據(jù)全部刪除,謹(jǐn)慎;) delete from class2 where id = 1; # 聯(lián)級(jí)更新 (把所有關(guān)聯(lián)數(shù)據(jù)全部更新,謹(jǐn)慎;) update class2 set id = 100 where classname="python33";
# ### part4 表與表之間的關(guān)系 (1) 一對(duì)一 : id name age sex address guanlian id userid mother father .... (2) 一對(duì)多(多對(duì)一) : 班級(jí)和學(xué)生之間的關(guān)系 一個(gè)班級(jí)可以對(duì)應(yīng)多個(gè)學(xué)生,反過(guò)來(lái),多個(gè)學(xué)生對(duì)應(yīng)一個(gè)班級(jí); (3) 多對(duì)多 : 一個(gè)學(xué)生可以同時(shí)學(xué)習(xí)多個(gè)學(xué)科,一個(gè)學(xué)科同時(shí)可以被多個(gè)學(xué)生學(xué)習(xí) 一本書可以被多個(gè)作者共同編寫,一個(gè)作者可以寫多本書 xueke (表1) id name 1 math 2 english 3 wuli student (表2) id name 1 wangwen 2 wangwei 3 wangtongpei relation (關(guān)系表3) """ 把 xid 和 sid 這兩個(gè)關(guān)聯(lián)字段設(shè)置成外鍵, 關(guān)聯(lián)xueke表里的id(對(duì)應(yīng)的xid) , 關(guān)聯(lián)student表里的id(對(duì)應(yīng)的sid) """ xid sid 1 1 1 2 1 3 2 1 2 2 2 3 # ### part5 存儲(chǔ)引擎 : 存儲(chǔ)數(shù)據(jù)的一種結(jié)構(gòu)方式 # 概念: 表級(jí)鎖 : 只要有一個(gè)線程執(zhí)行修改表中的相關(guān)操作,就會(huì)上鎖,其他線程默認(rèn)等待; 行級(jí)鎖 : 針對(duì)于當(dāng)前表中的這條記錄,這一行進(jìn)行上鎖,其他數(shù)據(jù)仍然可以被其他線程修改,實(shí)現(xiàn)高并發(fā),高可用; 事務(wù)處理: 執(zhí)行sql語(yǔ)句時(shí),必須所有的操作全部成功,才最終提交數(shù)據(jù),有一條失敗,直接回滾,恢復(fù)到先前狀態(tài) begin : 開啟事務(wù) commit : 提交數(shù)據(jù) rollback : 回滾數(shù)據(jù) MyISAM: 表級(jí)鎖 (5.5版本之前的默認(rèn)存儲(chǔ)引擎) InnoDB: 事務(wù)處理,行級(jí)鎖,外鍵 (5.5版本之后的默認(rèn)存儲(chǔ)引擎) MEMORY: 把數(shù)據(jù)放在內(nèi)存中,臨時(shí)緩存; BLACKHOLE: anything you write to it disappears 一般用于同步主從數(shù)據(jù)庫(kù);(放在主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)之間的一臺(tái)服務(wù)器;產(chǎn)生binlog日志進(jìn)行分發(fā),減輕master的壓力) """ 主數(shù)據(jù)庫(kù): 增刪改 從數(shù)據(jù)庫(kù): 查詢 配置: 一主一從 , 一主多從 , 多主多從 """ """ show engins; # 查看存儲(chǔ)引擎 show create table memary1; # 查看創(chuàng)建數(shù)據(jù)庫(kù)的結(jié)構(gòu) desc + 表名; # 查看表結(jié)構(gòu) """ create table myisam1( id int ) engine=MyISAM; .frm 表結(jié)構(gòu) .MYD 表數(shù)據(jù) .MYI 表索引 create table innodb1( id int ) engine=InnoDB; .frm 表結(jié)構(gòu) .ibd 表數(shù)據(jù)+表索引 create table memory1( id int ) engine=MEMORY; .frm 只有表結(jié)構(gòu) , 數(shù)據(jù)存放在內(nèi)存中 create table blackhole( id int ) engine=BLACKHOLE; .frm 只有表結(jié)構(gòu) , 所有的數(shù)據(jù)都不會(huì)存儲(chǔ); # ### 額外補(bǔ)充 # 關(guān)于約束的添加和刪除 # 1 添加/刪除 約束 not null #alter table 表名 modify 字段名 類型 alter table t1 modify id int not null alter table t1 modify id int # 2 添加/刪除 unique 唯一索引 # alter table 表名 add unique(id) alter table t1 add unique(id) alter table t1 drop index id # 3 添加/刪除 primary key # alter table 表名 add primary key(id); alter table t1 add primary key(id); alter table t1 drop primary key; # 4 添加/刪除 foreign key 外鍵 (先通過(guò)desc 表 找到外鍵名字,然后再刪) alter table student1 drop foreign key student1_ibfk_1; #刪除 alter table student1 add foreign key(classid) references class1(id) #添加
上述就是小編為大家分享的如何學(xué)習(xí)MySQL約束及存儲(chǔ)引擎了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。