索引的優點缺點
優點:加快查詢記錄的速度
缺點:占用實體存儲空間,會減慢寫速度(update delete insert)
mySQL索引支援的類型
index 普通索引
unique 唯一索引
primary key 主鍵
foreign key 外鍵
fulltext 全文索引
索引的使用
index 普通索引
primary key 主鍵
foreign key 外鍵
檢視表中是否有索引字段:
desc 表名;
檢視索引詳細資訊:
show index from 表名\G; (\G:每行獨立顯示)
普通索引 index 使用規則
1.一個表中可以有多個INDEX字段
2.字段的值允許有重複,切可以賦NULL值
3.經常把做查詢條件的字段設定為INDEX字段
4.INDEX字段的KEY标志是MUL
例題:
mysql> create table t26(
-> name char(10),
-> age int(2),
-> class char(7)default "nsd1724",
-> homedir varchar(20),
-> index(name),
-> index(gamedbclass)
-> );
mysql>inser tinto t26 values("bob",21,"nsd1702","shanghai");
mysql> insert into t26 values("bob",21,"nsd1703","beijing");
mysql> insert into t26 values("lucy",21,NULL,"beijing");
mysql> show index from t26\G;
在已有表裡建立
create index 索引名 on 表名(字段名);
create index aaa on t16(name);
索引名可以與字段名同名,
删除索引
drop index 索引名 on 表名;
drop index aaa on t16;
primary key 主鍵 使用規則
一個表中隻能有一個primary key字段
對應的字段值不允許有重複,且不允許賦NULL值
如果有多個字段都作為PRIMARY KEY,稱為複合主鍵,必須一起建立。
通常與 AUTO_INCREMENT 連用(自增長:做自加1++的運算 的值給)
經常把表中能夠唯一辨別記錄的字段設定為主鍵字段[記錄編号字段]
主鍵字段的KEY标志是PRI
方法一:mysql> create table t27(
-> stu_id char(7),
-> name char(10),
-> age int(2),
-> primary key(stu_id)
-> );
方法二:mysql> create table t28(
-> stu_id char(7) primary key,
在已有表建立主鍵
alter table 表名 add primary key(字段名);
alter table t16 add primary key(name);
删除主鍵
alter table 表名 drop primary key;
alter table t16 drop primary key;
複合主鍵 (做主健的值不能同時相同)
多個字段必須同時做主鍵,多個字段值不同時相同重複就可以。
PRI PRI
cip por access
clientip serport status
1.1.1.1 21 deny
1.1.1.1 21 allow
2.1.1.1 80 deny
mysql> create table t29(
-> cip varchar(15),
-> port smallint(2),
-> access enum("allow","deny"),
-> primary key(cip,port)
mysql>insert into t29 values("1.1.1.1",21,"deny");
mysql>insert into t29 values("1.1.1.1",23,"allow");
mysql>insert into t29 values("2.1.1.1",23,"deny");
mysql> select * from t29;
在已有表裡建立複合主鍵
alter table t24 add primary key(字段名清單);
預設從0開始加1 的結果賦給第一個字段,自己指派不能賦給已用的值,從最大值自動加1去指派。
primary key 與 auto_increment 一起使用
自動增長 ++
數值類型
主鍵
id name age class maill
1 jim 21 nsd1704 [email protected]
2 tom 29 nsd1704 [email protected]
mysql> create table t221(
-> id int(2) zerofill primary key
-> auto_increment,
-> name char(5),
-> class char(7),
-> mail varchar(30)
mysql>insert into t221(name,age,class,mail) values("jim",21,"nad1704","[email protected]");
mysql>insert into t221(name,age,class,mail) values("tom",29,"nad1702","[email protected]");
mysql>insert into t221(name,age,class,mail) values("xixi",20,"nsd1704","[email protected]");
mysql> insert into t221 values(6,"haha",21,"nsd1702","[email protected]");
mysql> insert into t221 values(null,"haha",21,"nsd1702","[email protected]");
Null #空可以寫進去是因為他可以自動增長排序。
mysql> select * from t221;
unique 唯一索引使用規則 (主健)
一個表中可以有多個UNIQUE字段
對應的字段值不允許有重複
UNIQUE字段的KEY标志是UNI
UNIQUE字段的值允許為NULL,當将其修改為不允許為NULL,則此字段限制與主鍵相同.(但是他并不是主鍵,删除不能用主鍵的删除方法。)
姓名 護照 駕駛證
NULL NULL
jim xxxx cccc
bob xxxx cccc
建表是建立unique
mysql> create table t222(
-> sf_id char(18),
-> js_id char(8),
-> unique(sf_id),
-> unique(js_id)
-> );
mysql> insert into t222 values("bob","123456789","66666");
mysql> insert into t222 values("tom","4567891323","45679");
mysql> insert into t222 values("hshs","","");
mysql> insert into t222 values("hshs",null,null);
在已有表裡建立unique
create unique index 索引名 on 表名(字段名);
create unique index sh_id on t27(sh_id)
删除unique索引
drop index 索引名 on 表名;
外鍵foreign key 使用規則
1 表的存儲引擎必須是innodb
2 字段的類型必須比對
3 被參考字段必須是索引(key)的一種(通常是primary key主健)
外鍵的功能:給目前表的字段指派時,隻能在另外一張表的中字段值的範圍裡做選擇。
例題:必須先要建立财務表。
cwb财務表
cwb_id name pay
1 tom 2W
2 jerry 2W
3 unll 2W
mysql> create table cwb(
-> cwb_id int(2) primary key
-> pay float(7,2)
-> )engine=innodb;
班級表
stu_id name
1 tom
2 jerry
3 unll
mysql> create table bjb(
-> bjb_id int(2),
-> foreign key(bjb_id) references cwb (cwb_id) on update cascade on delete cascade
-> )engine=innodb;
foreign key(bjb_id) #為班級的id建立外健。
references cwb (cwb_id) # 參考的是财務表的id。
on update cascade #于财務表的資訊同步更新。為了保持資訊一緻
on delete cascade #于财務表的資訊同步删除。
mysql>insert into cwb(name,pay) values("bob",20000),("tom",20000),("lucy",20000);
mysql> select * from cwb;
mysql> insert bjb values(3,"lucy");
mysql> insert bjb values(1,"bob");
mysql> insert bjb values(2,"tom");
mysql> insert bjb values(null,"tom");
#null是沒有值,相當于沒有寫,沒有限制不允許寫空值。
隻要在财務表的範圍裡都可以寫入,無論重複不重複。
同步更新:
mysql> update cwb set cwb_id=8 where cwb_id=2;
#把原來财表裡的id=2 修改成id=8.驗證同步。
mysql> select * from bjb;
同步删除一條表記錄:
mysql> delete from cwb where cwb_id=8;
Delete from cwd; #如果不加條件删除全部班級裡的内容也會
删除外鍵、檢視外鍵名:
檢視格式: show create table 表名;(建立外鍵的表名)
删除格式:
alter table 表名 drop foreign key 限制名;
(建立外鍵的表名)
例題:
mysql> show create table bjb;
mysql> alter table bjb drop foreign key bjb_ibfk_1;
在已有表裡添加外鍵
格式:alter table (表名) add foreign key(列名) references cwb(列名) on update cascade on delete cascade;
備注:建立外鍵的表名,建立外健的列名,參考的列名。
mysql> alter table bjb
-> add
-> foreign key(bjb_id)references cwb(cwb_id)
-> on update cascade on delete cascade;
解釋: foreign key(bjb_id)references cwb(cwb_id)
#指定給哪列作外鍵,參考的對象是誰。